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.]]
然而,我想知道是否有更好的解决方法。我的意思是更简单,更快捷或更简单......
答案 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
。这为我们提供了第一行代码中列出的布尔数组或掩码。然后,我们使用此掩码映射A
和B
,并在第二行代码中将掩码值从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]])