为什么 2D NumPy 数组的布尔索引会生成 1d 数组?

Joe*_*ese 5 python boolean numpy

我正在 NumPy 中尝试布尔索引,并发现了这一点,这让我感到困惑:

import numpy as np

np.random.seed(0)
Run Code Online (Sandbox Code Playgroud)

创建了一个 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]]
Run Code Online (Sandbox Code Playgroud)

同样创建了一个 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]
Run Code Online (Sandbox Code Playgroud)

输出:

[ 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]
Run Code Online (Sandbox Code Playgroud)

这该如何解释呢?我的推理如下:行数相同(即7)。对于每一行,True可在位置 0 和 3(即 2 个值)处找到。因此我最终得到一个 1 x 14 矩阵。不过我期待的是 7 x 2 矩阵。

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

Mad*_*ist 3

Numpy 没有先验的方法来知道True掩码的元素在哪里。您的选择在列中如此整齐地对齐纯属偶然。

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

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

a[:, ::3]
Run Code Online (Sandbox Code Playgroud)

或者

a[:, [0, 3]]
Run Code Online (Sandbox Code Playgroud)