对于二维数组 y:
y = np.arange(20).reshape(5,4)
---
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]]
所有索引都选择第 1、第 3 和第 5 行。这很清楚。
print(y[
[0, 2, 4],
::
])
print(y[
[0, 2, 4],
::
])
print(y[
[True, False, True, False, True],
::
])
---
[[ 0 1 2 3]
[ 8 9 10 11]
[16 17 18 19]]
问题
请帮助了解产生结果的规则或机制。
用元组替换[]
会产生一个形状为 (0, 5, 4) 的空数组。
y[
(True, False, True, False, True)
]
---
array([], shape=(0, 5, 4), dtype=int64)
使用单个True
添加一个新轴。
y[True]
---
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]]])
y[True].shape
---
(1, 5, 4)
添加额外的布尔值 True 产生相同的结果。
y[True, True]
---
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]]])
y[True, True].shape
---
(1, 5, 4)
但是,添加 False boolean 会再次导致空数组。
y[True, False]
---
array([], shape=(0, 5, 4), dtype=int64)
不确定文档解释了这种行为。
通常,如果索引包含布尔数组,则结果与将 obj.nonzero() 插入同一位置并使用上述整数数组索引机制相同。x[ind_1, boolean_array, ind_2] 等价于 x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]。
如果只有一个布尔数组而没有整数索引数组,这很简单。只需要注意确保布尔索引的维度与它应该使用的维度一样多。