将函数应用于不带循环的嵌套numpy数组

将函数应用于不带循环的嵌套numpy数组,numpy,Numpy,我正在编写一个遗传算法,在避免循环方面遇到了一些问题 对双亲应用交叉时。到目前为止,我所拥有的很接近,但我 最后一步需要一些帮助 总体是一个二维数组,每个个体都是一个一维数组: pop = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 为了得到双亲,我使用下面的方法,所以双亲是一个3d数组 i、 e.一组双亲: inds = np.arange(pop.shape[0]).reshape((2,2)) parents = np.take(pop,

我正在编写一个遗传算法,在避免循环方面遇到了一些问题 对双亲应用交叉时。到目前为止,我所拥有的很接近,但我 最后一步需要一些帮助

总体是一个二维数组,每个个体都是一个一维数组:

pop = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
为了得到双亲,我使用下面的方法,所以双亲是一个3d数组 i、 e.一组双亲:

inds = np.arange(pop.shape[0]).reshape((2,2))
parents = np.take(pop, inds, axis=0)
[[[ 1  2  3]
  [ 4  5  6]]
 [[ 7  8  9]
  [10 11 12]]]
现在,我要执行交叉,这有签名

crossover: [parent1, parent2] -> [child1, child2]
如果子对象也是一维数组,则每个交叉都会产生2个子对象

如此给定的人口

[p1
 p2
 p3
 p4]
我想回去

[crossover(p1,p2)[0]
 crossover(p1,p2)[1]
 crossover(p3,p4)[0]
 crossover(p3,p4)[1]]
或者,因为它可以简单地展平

[crossover(p1,p2)
 crossover(p3,p4)]
我试过使用
np.apply_沿_轴
,但我认为这是不可能的 应用于一对父对象,一次只应用一个父对象(通过使用
axis=-1

有人能提出任何唯一的方法来做到这一点吗

其他信息-这是我目前的做法,有一个列表comp:

children = [
        crossover(pop[2 * i], pop[2 * i + 1])
        for i in range(pop.shape[0] // 2)
]

好的,我设法让它工作,即使这意味着改变我的交叉功能一点。 通过重塑pop数组,可以连接连续行

pop = np.array([[0,1,5,6,7,2,3,4],[0,7,2,6,1,5,4,3],[2,5,1,7,0,3,4,6],[7,6,5,1,2,0,4,3]])
pop_resh = pop.reshape((pop.shape[0]//2, -1))

[[0 1 5 6 7 2 3 4]
 [0 7 2 6 1 5 4 3]
 [2 5 1 7 0 3 4 6]
 [7 6 5 1 2 0 4 3]]

[[0 1 5 6 7 2 3 4 0 7 2 6 1 5 4 3]
 [2 5 1 7 0 3 4 6 7 6 5 1 2 0 4 3]]
现在,沿_轴应用_可以用于每一对组合行,然后重塑以返回到起始形状

children = np.apply_along_axis(py_crossover, 1, pop_resh).reshape(pop.shape)

[[0 7 6 1 5 2 3 4]
 [0 1 6 7 2 5 4 3]
 [6 5 1 7 0 2 4 3]
 [7 6 5 1 2 0 3 4]]

我不确定我是否会使用它,或者只是坚持使用列表comp,但这个解决方案至少可以帮助其他人。

好的,我成功地让它工作了,即使这意味着稍微更改了我的交叉功能。 通过重塑pop数组,可以连接连续行

pop = np.array([[0,1,5,6,7,2,3,4],[0,7,2,6,1,5,4,3],[2,5,1,7,0,3,4,6],[7,6,5,1,2,0,4,3]])
pop_resh = pop.reshape((pop.shape[0]//2, -1))

[[0 1 5 6 7 2 3 4]
 [0 7 2 6 1 5 4 3]
 [2 5 1 7 0 3 4 6]
 [7 6 5 1 2 0 4 3]]

[[0 1 5 6 7 2 3 4 0 7 2 6 1 5 4 3]
 [2 5 1 7 0 3 4 6 7 6 5 1 2 0 4 3]]
现在,沿_轴应用_可以用于每一对组合行,然后重塑以返回到起始形状

children = np.apply_along_axis(py_crossover, 1, pop_resh).reshape(pop.shape)

[[0 7 6 1 5 2 3 4]
 [0 1 6 7 2 5 4 3]
 [6 5 1 7 0 2 4 3]
 [7 6 5 1 2 0 3 4]]

我不确定我是否会使用它,或者只是坚持使用列表comp,但这个解决方案可能至少会帮助其他人。

预期的o/p是什么?
apply\u-areasy\u-axis
只是一个方便的迭代器,在使用3d数组时最有用。它不是一个速度工具。它不会编译您的函数。如果您不知道如何重写
crossover
来处理整个数组,我建议使用索引进行明显的迭代?我将添加更多信息。@hpaulj感谢您的评论。我知道这不是为了速度。但我正在尝试学习numpy,以及如何使用使编码更容易的函数:)预期的o/p是什么?
apply\u沿轴
只是一个方便的迭代器,在处理3d数组时最有用。它不是一个速度工具。它不会编译您的函数。如果您不知道如何重写
crossover
来处理整个数组,我建议使用索引进行明显的迭代?我将添加更多信息。@hpaulj感谢您的评论。我知道这不是为了速度。但我正在努力学习numpy,以及如何使用使编码更容易的函数:)