通过在python中应用布尔掩码(相同大小的布尔矩阵)返回一个矩阵。

问题描述 投票:0回答:1

我已经生成了一个大小为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中的每个元素并比较它们,然后将其分配到一个新的矩阵中?

python-3.x numpy boolean boolean-logic
1个回答
0
投票
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 ]])

重塑是否合理取决于元素的总数,以及你自己对数据的解释。


0
投票

如果你想删除任何至少包含在 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]]
© www.soinside.com 2019 - 2024. All rights reserved.