Python numpy根据另一个矩阵中的顺序填充矩阵中的蒙版元素

时间:2015-12-31 00:17:58

标签: python arrays numpy matrix

我试图为遗传算法做一个统一顺序交叉。在那里,我有两个2D阵列p1和p2以及一个2D位阵列,b。 p1,p2和b具有相同的形状。我屏蔽了p1中对应于b中的1s的元素和对应于b中的0的p2中的元素。从这些开始,我需要生成2个矩阵c1和c2,使得c1具有与p2中相同的元素,但是按照p1中给出的顺序将空白替换为p2中的相应值,而c1则相反。

例如:

p1 = [[1, 2, 3, 4, 5],
      [1, 4, 3, 2, 5]]
p2 = [[5, 4, 3, 2, 1],
      [2, 1, 3, 4, 5]]
b = [[1, 0, 1, 0, 1],
     [1, 0, 0, 1, 0]]

屏蔽数组是mp1和mp2;

mp1 = [[1, _, 3, _, 5],
       [1, _, _, 2, _]]
mp2 = [[_, 4, _, 2, _],
       [_, 1, 3, _, 5]]

然后c1和c2将是​​,

c1 = [[1, 4, 3, 2, 5],
      [1, 3, 4, 2, 5]]
c2 = [[1, 4, 3, 2, 5],
      [4, 1, 3, 2, 5]]
在我的情况下,p1,p2,b,c1,c2的维度为500X100000,因此答案需要进行矢量化和高效。

1 个答案:

答案 0 :(得分:0)

我无法确切地理解你究竟在问什么,因为要么你在问题上写错了,要么我在这里完全忽略了这一点。

所以,首先我们有一个p1的掩码

mp1 = [[1, _, 3, _, 5],
       [1, _, _, 2, _]]

其中_值应替换为p2中的相应值。哪个应该是

[[_, 4, _, 2, _],
 [_, 1, 3, _, 5]]

所以在我的脑海里,结果应该是

[[1, 4, 3, 2, 5],
 [1, 1, 3, 2, 5]])

但你说预期的结果是

[[1, 4, 3, 2, 5],
 [1, 3, 4, 2, 5]]

3如何出现在那里以及4来自哪里?我错过了什么? (在任何人反对我之前,我不能在评论中说明这一点)

如果你可以使用numpy,对于这样的东西,我建议你做,解决方案,尽我所能的解释能力,将是:

p1 = [[1, 2, 3, 4, 5],
      [1, 4, 3, 2, 5]]
p2 = [[5, 4, 3, 2, 1],
      [2, 1, 3, 4, 5]]
b = [[1, 0, 1, 0, 1],
     [1, 0, 0, 1, 0]]

#this is just how you turn python lists into numpy arrays
import numpy as np
p1 = np.asarray(p1)
p2 = np.asarray(p2)
b = np.asarray(b)

#this is the actual solution to the problem
p1[b==0] = p2[b==0]

这些替换是在适当的位置完成的,因此它对内存很有好处,它们基本上都是在C语言的后台完成的,这意味着它很快。