首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将函数应用于不带循环的嵌套numpy数组

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

Stack Overflow用户
提问于 2020-10-25 19:08:41
回答 1查看 239关注 0票数 1

我正在编写一种遗传算法,在将交叉应用于一对父母时,在避免循环方面遇到了一些问题。到目前为止,我已经接近了,但在最后一步我需要一些帮助。

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

代码语言:javascript
运行
复制
pop = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])

要获得父母对,我使用下面的内容,因此父母是一个3d数组,即一对父母的数组:

代码语言:javascript
运行
复制
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]]]

现在我要执行交叉操作,它有签名。

代码语言:javascript
运行
复制
crossover: [parent1, parent2] -> [child1, child2]

当子节点也是一个一维数组时,每次交叉都会产生两个子数组。

所以给定的人口

代码语言:javascript
运行
复制
[p1
 p2
 p3
 p4]

我想回去

代码语言:javascript
运行
复制
[crossover(p1,p2)[0]
 crossover(p1,p2)[1]
 crossover(p3,p4)[0]
 crossover(p3,p4)[1]]

或者,因为它可以简单地被压平

代码语言:javascript
运行
复制
[crossover(p1,p2)
 crossover(p3,p4)]

我尝试过使用np.apply_along_axis,但我认为不可能将它应用于一对父母,一次只使用一个家长(通过使用axis=-1)。

有人能给我建议一下这样做的唯一方法吗?

附加信息--这是我目前正在做的事情,并列出了一个列表:

代码语言:javascript
运行
复制
children = [
        crossover(pop[2 * i], pop[2 * i + 1])
        for i in range(pop.shape[0] // 2)
]
EN

回答 1

Stack Overflow用户

发布于 2020-10-25 20:21:57

好的,我设法让它开始工作,即使它意味着稍微改变我的交叉函数。通过重新构造pop数组,您可以连接连续的行。

代码语言:javascript
运行
复制
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]]

现在可以在每一对合并的行上使用apply_along_axis,然后对其进行整形以回到起始形状。

代码语言:javascript
运行
复制
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,但是这个解决方案至少可以帮助到其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64527705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档