保证非零相等时的Numpy 2D数组联合

时间:2018-06-22 16:00:32

标签: python arrays numpy matrix

我有两个NxN numpy数组,它们的大小相等。

如果第一个数组中的给定行和列不为零,则可以保证我们在另一个数组的同一行和列中具有相同的值,或者在该位置处我们为零。

如果第一个数组中的给定行和列为零,那么我们在另一个数组中的行和列中可以为零或非零值。

我想合并两个数组,以便对于每个[row,col],如果一个数组的值为零,而另一个数组的值为非零,那么我的第二个数组将被修改(如有必要),非零值。

并且,如果它们都具有非零值(保证该值是相同的),则该行(列)将没有修改-它保持不变。

示例:

数组1:

[[0,9],[2,0]]

数组2:

[[0,0],[2,2]]

完成“联合”后,我希望数组2为:

[[0,9],[2,2]]

对大型矩阵执行此操作的快速方法是什么?谢谢。

2 个答案:

答案 0 :(得分:2)

您要做的就是将第二个数组中的零更改为第一个数组中相同索引的项。您可以执行以下操作:

mask = arr2 == 0
arr2[mask] = arr1[mask]

演示:

In [7]: arr1 = np.array([[0,9],[2,0]])

In [8]: arr2 = np.array([[0,0],[2,2]])

In [9]: mask = arr2 == 0

In [10]: arr2[mask] = arr1[mask]

In [11]: arr2
Out[11]: 
array([[0, 9],
       [2, 2]])

答案 1 :(得分:1)

由于您要求“快速”,您可能会对np.copyto感兴趣:

>>> a = np.random.randint(0, 2, (100, 100))
>>> b = np.random.randint(-1, 1, (100, 100))
>>> 
>>> 
>>> timeit("bk = b.copy(); mask=bk==0; bk[mask] = a[mask]", globals=globals(), number=10000)
1.3142543959984323
>>> timeit("bp = b.copy(); np.copyto(bp, a, where=bp==0)", globals=globals(), number=10000)
0.7330851459992118
>>> 
# check results are the same
>>> bk = b.copy(); mask=bk==0; bk[mask] = a[mask]
>>> bp = b.copy(); np.copyto(bp, a, where=bp==0)
>>> np.all(bk==bp)
True