【问题标题】:Return a matrix by applying a boolean mask (a boolean matrix of same size) in python通过在 python 中应用布尔掩码(相同大小的布尔矩阵)返回一个矩阵
【发布时间】:2020-08-07 15:13:00
【问题描述】:

我通过以下方式生成了一个大小为 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,这样,我得到 A 的 3 x 3 矩阵,其中 B 为真(B 中的元素 == True)。 他们在 numpy 中是否有任何逻辑运算符来执行此操作?还是我必须遍历 A 和 B 的每个元素并比较它们,然后将其分配给一个新矩阵?

【问题讨论】:

    标签: python-3.x numpy boolean boolean-logic


    【解决方案1】:
    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]])
    

    布尔索引(具有匹配大小的数组)始终生成一维数组。在这种情况下,它没有为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 行都有 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 ]])
    

    重塑是否有意义取决于元素的总数,以及您自己对数据的解释。

    【讨论】:

      【解决方案2】:

      如果您要删除其中至少包含 False 元素的任何行/列,您可以使用 np.any 查找此类行和列,然后使用 np.ix_ 从行/创建二维数组列索引:

      A=A[np.ix_(*np.where(np.any(B, axis=0)), *np.where(np.any(B, axis=1)))]
      

      这将为您提供任何 2D numpy 数组和相同形状的布尔掩码/条件的输出。您可以通过在括号中添加维度来将其扩展为任何维度的 numpy 数组。

      样品A:

      [[-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]]
      

      用 B 掩蔽 A:

      [[ 0.13962857  1.97189081 -0.7686762 ]
       [-0.36612182  0.77802273  0.23195807]
       [ 0.44672696  0.45970364 -1.58457129]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2014-01-02
        • 1970-01-01
        • 2014-04-21
        相关资源
        最近更新 更多