将函数应用于不带循环的嵌套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,以及如何使用使编码更容易的函数:)