NumPy 2D 数组布尔索引与每个轴

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

我创建了 2D 数组,并使用 2 个布尔索引数组进行了布尔索引。 第一个用于轴 0,下一个用于轴 1。

我期望像 Pandas 一样选择每个轴上的交叉 True 和 True 值。 但结果却不是。

我想知道下面的代码是如何工作的。 我想从官方 numpy 网站获取描述这个问题的链接。

提前致谢。

a = np.arange(9).reshape(3,3)
a
----------------------------
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
a[ [True, False, True], [True, False, True] ]
--------------------------
array([0, 8])

我的期望是

[0, 6, 2, 8]
。 (我知道如何得到我期望的结果。)

python numpy indexing boolean 2d
3个回答
2
投票
In [20]: a = np.arange(9).reshape(3,3)

如果将列表传递给

ix_
,结果是 2 个可以使用的数组,用
broadcasting
来索引所需的块:

In [21]: np.ix_([True, False, True], [True, False, True] )
Out[21]: 
(array([[0],
        [2]]),
 array([[0, 2]]))
In [22]: a[_]
Out[22]: 
array([[0, 2],
       [6, 8]])

这不是一维的,但很容易破解。

尝试创建等效的布尔数组不起作用:

In [23]: a[[[True], [False], [True]], [True, False, True]]
Traceback (most recent call last):
  File "<ipython-input-23-26bc93cfc53a>", line 1, in <module>
    a[[[True], [False], [True]], [True, False, True]]
IndexError: too many indices for array: array is 2-dimensional, but 3 were indexed

布尔索引必须是 1d 或与目标匹配的 nd,此处为 (3,3)。

In [26]: np.array([True, False, True])[:,None]& np.array([True, False, True])
Out[26]: 
array([[ True, False,  True],
       [False, False, False],
       [ True, False,  True]])

0
投票

你想要的是连续的切片:

a[[True, False, True]][:,[True, False, True]]

a = np.arange(9).reshape(3,3)
x = [True, False, True]
y = [True, False, True]
a[x][:,y]

作为平面阵列

a[[True, False, True]][:,[True, False, True]].flatten(order='F')

输出:

array([0, 6, 2, 8])

替代方案

注意。这需要数组进行切片

a = np.arange(9).reshape(3,3)
x = np.array([False, False, True])
y = np.array([True, False, True])
a.T[x&y[:,None]]

输出:

array([0, 6, 2, 8])


0
投票

这是我试图解释的...假设 2 个布尔数组用于 2 个轴,b1 和 b2,即 x[b1,b2]。

NumPy 似乎会从 b1 和 b2 构造 (True, True) 对,一个来自 b1,另一个来自 b2。它记录b1中的哪个索引和b2中的哪个索引形成(True, True)对。这一直持续到所有(True,True)对都已形成。然后使用索引对从 x[ : , : ] 中提取元素。

如果存在不匹配的 (True, ?) 或 (?, True) 对,则会产生 IndexError。

例如,b1 有 [True, False, True, False],b2 有 [True, True, False, False]。对 x[b1,b2] 的引用将导致以下结果:

  • 第一对(True, True)来自 [0,0]。
  • 第二对(True, True)来自 [2,1]。

x[b1,b2] 与 [ x[0,0] x[2,1] ] 相同。

© www.soinside.com 2019 - 2024. All rights reserved.