Numpy中的数组表达式

hiz5n14c  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

请仅使用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.]]


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

abithluo

abithluo1#

您可以使用np.where将Divakar的解决方案转换为一行程序:

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

字符串
语法是:

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

lndjwyie

lndjwyie2#

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

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

字符串
基本上,我们只在B中的值大于A中的值的地方将值插入A,从而复制max条件,然后将其与C为99C==99的条件重叠。这给了我们一个布尔数组或掩码,如第一行代码所列。然后,我们使用这个掩码来MapAB,并在第二行代码中将掩码值从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]])

相关问题