Numpy中的数组表达式

时间:2015-04-17 03:54:01

标签: python numpy scipy

PLS。仅限NumPy:

import numpy as np
A = np.ones((5,5))*3
print A

[[ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]]

B = np.ones((5,5))*5
print B
[[ 5.  5.  5.  5.  5.]
 [ 5.  5.  5.  5.  5.]
 [ 5.  5.  5.  5.  5.]
 [ 5.  5.  5.  5.  5.]
 [ 5.  5.  5.  5.  5.]]


C = np.ones((5,5))
C[0:2,0:2] = 99
print C

[[ 99.  99.   1.   1.   1.]
 [ 99.  99.   1.   1.   1.]
 [  1.   1.   1.   1.   1.]
 [  1.   1.   1.   1.   1.]
 [  1.   1.   1.   1.   1.]]

A,B和C是给定的条件。我想计算A,B之间的最大值,其中C值为99;并将结果放入A.以下代码正常工作。

A[C==99] = np.max([A, B],axis=0)[C==99]

print A

预期结果是:

[[ 5.  5.  3.  3.  3.]
 [ 5.  5.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]]

然而,我想知道是否有更好的解决方法。我的意思是更简单,更快捷或更简单......

2 个答案:

答案 0 :(得分:2)

您可以使用np.where将Divakar的解决方案转换为单线:

np.where((C == 99) & (B > A), B, A)

语法为:

np.where(<mask>, <value_if_mask>, <value_if_not_mask>)

答案 1 :(得分:1)

您可以在此使用boolean indexing,从而避免像这样调用np.max -

mask = (B>A) & (C==99)
A[mask] = B[mask]

基本上,只有当A中的值大于B中的值,从而复制A条件然后将其与条件重叠时,我们才会将值插入max C为99 C==99。这为我们提供了第一行代码中列出的布尔数组或掩码。然后,我们使用此掩码映射AB,并在第二行代码中将掩码值从B传输到A.


这是一个示例运行(注意A中结尾处的值与开始时A中的值相比发生了变化) -

In [66]: A
Out[66]: 
array([[2, 2, 4, 6, 2, 3],
       [6, 4, 2, 4, 3, 5],
       [5, 4, 4, 3, 6, 4],
       [4, 2, 4, 5, 6, 5],
       [2, 5, 5, 5, 2, 5]])

In [67]: B
Out[67]: 
array([[5, 4, 6, 4, 5, 3],
       [5, 6, 3, 4, 7, 6],
       [7, 3, 5, 3, 7, 5],
       [7, 3, 6, 4, 6, 7],
       [7, 4, 7, 7, 3, 6]])

In [68]: C
Out[68]: 
array([[100,  99, 100, 100,  99, 100],
       [100,  99,  99, 100, 100, 100],
       [ 99,  99, 100,  99, 100, 100],
       [100, 100, 100, 100, 100, 100],
       [100,  99,  99, 100,  99,  99]])

In [69]: mask = (B>A) & (C==99)

In [70]: A[mask] = B[mask]

In [71]: A
Out[71]: 
array([[2, 4, 4, 6, 5, 3],
       [6, 6, 3, 4, 3, 5],
       [7, 4, 4, 3, 6, 4],
       [4, 2, 4, 5, 6, 5],
       [2, 5, 7, 5, 3, 6]])