在相同形状的数组中根据逻辑和值来进行大量替换元素

时间:2019-07-03 16:25:55

标签: python arrays numpy if-statement logical-operators

我有2个numpy数组。一个充满布尔值,另一个充满数值。

如何根据布尔数组中的当前值在数字数组上执行逻辑。

例如如果为true且> 5,则将值设为false

matrix1
matrix2

newMatrix = matrix1 > 5 where matrix2 value is false

请注意,这些数组具有相同的形状,例如

[[0, 1, 1],  
[1, 0, 0]]

[[3, 1, 0]  
[6, 2, 6]]

我想要的结果将是一个新的布尔矩阵,如果在布尔数组中其值为true且在数值数组中的等效值大于5,则为true。

[[0, 0, 0]  
[1, 0, 0]]

2 个答案:

答案 0 :(得分:0)

newMatrix = np.logical_and(matrix2 == 0, matrix1 > 5 )

这将遍历所有元素,并在matrix == 0matrix1 > 5的成对布尔值之间做一个“与”。请注意,matrix1 > 5类型的表达式会生成布尔值矩阵。

如果您想要0,1而不是False,True,则可以在结果中添加+0:

newMatrix = np.logical_and(matrix2 == 0, matrix1 > 5 ) + 0

答案 1 :(得分:0)

最清晰的方式:

import numpy as np

matrix1 = np.array([[3, 1, 0],
                    [6, 2, 6]])

matrix2 = np.array([[0, 1, 1],
                    [1, 0, 0]])

r,c = matrix1.shape

res = np.zeros((r,c))

for i in range(r):
    for j in range(c):
        if matrix1[i,j]>5 and matrix2[i,j]==1:
            res[i,j]=1

结果

array([[0., 0., 0.],
       [1., 0., 0.]])

一种更高级的方式,使用numpy.where()

import numpy as np

matrix1 = np.array([[3, 1, 0],
                    [6, 2, 6]])

matrix2 = np.array([[0, 1, 1],
                    [1, 0, 0]])

r,c = matrix1.shape

res = np.zeros((r,c))

res[np.where((matrix1>5) & (matrix2==1))]=1

结果

array([[0., 0., 0.],
       [1., 0., 0.]])