首页 文章

NumPy中的布尔索引

提问于
浏览
2

我是Python和NumPy的新手,我在NumPy中尝试使用布尔索引,遇到了这个令我困惑的事情:

import numpy as np

np.random.seed(0)

创建了一个7 x 4阵列:

data = np.random.rand(7, 4) 

[[ 0.5488  0.7152  0.6028  0.5449]

 [ 0.4237  0.6459  0.4376  0.8918]

 [ 0.9637  0.3834  0.7917  0.5289]

 [ 0.568   0.9256  0.071   0.0871]

 [ 0.0202  0.8326  0.7782  0.87  ]

 [ 0.9786  0.7992  0.4615  0.7805]

 [ 0.1183  0.6399  0.1434  0.9447]]

创建了一个7 x 4的布尔数组:

bool_array = 

         ([[True,False,False,True],
          [True,False,False,True],
          [True,False,False,True],
          [True,False,False,True],
          [True,False,False,True],
          [True,False,False,True],
          [True,False,False,True]])


bool_array = np.array(bool_array)

data[bool_array]

输出:

[ 0.5488  0.5449  0.4237  0.8918  0.9637  0.5289  0.568   0.0871  0.0202
  0.87    0.9786  0.7805  0.1183  0.9447]

怎么解释这个?我的理由如下:行数相同(即7) . 对于每一行,在位置0和3处找到“真”(即2个值) . 因此,我最终得到一个1 x 14矩阵 . 我期待一个7 x 2的矩阵 .

有人可以澄清如何评估它是如何给出一个1 x 14矩阵?

1 回答

  • 0

    Numpy没有先验的方法知道你面具的 True 元素在哪里 . 您的选择在列中如此整齐地排列,这纯粹是偶然的 .

    要理解为什么结果被分解为一维数组,想象一下如何处理每行中有两个选择但不总是来自同一列的情况 . 现在想象一下每行中选择的数量不同的情况,可能有些行完全为空 . Numpy必须能够始终如一地处理所有这些案件 . 它会慢得多,并且会根据蒙版的内容返回不同形状的数组会导致很多问题 .

    要选择所需的列,请使用适当的索引:

    a[:, ::3]
    

    要么

    a[:, [0, 3]]
    

相关问题