我已经生成了一个大小为4的正方形矩阵和一个大小相同的布尔矩阵。
import numpy as np
A = np.random.randn(4,4)
B = np.full((4,4), True, dtype = bool)
B[[0],:] = False
B[:,[0]] = False
下面的代码返回两个大小为4的矩阵,A是所有的随机数,B是所有的布尔运算符,其中第一行和第二列都是假的。
B = [[False, False, False, False],
[False, True, True, True],
[False, True, True, True],
[False, True, True, True]]
我想把B布尔矩阵应用到A中,这样,我得到一个3乘3的A矩阵,其中B为True(B中的元素==True).在numpy中是否有任何逻辑运算符来执行这个操作? 或者我必须通过A和B中的每个元素并比较它们,然后将其分配到一个新的矩阵中?
In [214]: A = np.random.randn(4,4)
...: B = np.full((4,4), True, dtype = bool)
...: B[[0],:] = False
...: B[:,[0]] = False
In [215]: A
Out[215]:
array([[-0.80676817, -0.20810386, 1.28448594, -0.52667651],
[ 0.6292733 , -0.05575997, 0.32466482, -0.23495175],
[-0.70896794, -1.60571282, -1.43718839, -0.42032337],
[ 0.01541418, -2.00072652, -1.54197002, 1.2626283 ]])
In [216]: B
Out[216]:
array([[False, False, False, False],
[False, True, True, True],
[False, True, True, True],
[False, True, True, True]])
布尔索引(与大小数组匹配)总是产生一个1d数组。 在本例中,它没有选择任何值给 A[0,:]
:
In [217]: A[B]
Out[217]:
array([-0.05575997, 0.32466482, -0.23495175, -1.60571282, -1.43718839,
-0.42032337, -2.00072652, -1.54197002, 1.2626283 ])
但是,因为其他三行都有3个。True
,重塑结果确实会产生一个合理的结果。
In [218]: A[B].reshape(3,3)
Out[218]:
array([[-0.05575997, 0.32466482, -0.23495175],
[-1.60571282, -1.43718839, -0.42032337],
[-2.00072652, -1.54197002, 1.2626283 ]])
重塑是否合理取决于元素的总数,以及你自己对数据的解释。
如果你想删除任何至少包含在 False
元素,你可以使用 np.any
找到这样的行和列,然后用 np.ix_
从rowcol索引创建2D数组。
A=A[np.ix_(*np.where(np.any(B, axis=0)), *np.where(np.any(B, axis=1)))]
这将为你提供任何2D numpy数组和相同形状的布尔掩码条件的输出。你可以通过在括号中添加维度来扩展到任何维度的numpy数组。
示例 A. 屏蔽 A 与 B:这将给出任何二维 numpy 数组和相同形状的 boolean maskcondition 的输出。
[[-0.36027839 -1.54588632 0.1607951 1.68865218]
[ 0.20959185 0.13962857 1.97189081 -0.7686762 ]
[ 0.03868048 -0.36612182 0.77802273 0.23195807]
[-1.26148984 0.44672696 0.45970364 -1.58457129]]
屏蔽A与B:
[[ 0.13962857 1.97189081 -0.7686762 ]
[-0.36612182 0.77802273 0.23195807]
[ 0.44672696 0.45970364 -1.58457129]]