针对二维数组 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布尔值会再次导致空数组。
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,)]。
如果只有一个布尔数组而没有整数索引数组,那么这就很简单。只需要确保布尔索引的维数与应该使用的维数完全相同即可。
布尔标量
索引(而不是布尔数组/列表索引)。我不记得看到过它的文档。看起来像是True
会添加一个前导大小为1的维度,而任何False
都会添加一个前导大小为0的维度。我不会指望它在任何生产工作中使用(就好像它是all(the_boolean_tuple)
一样)。 - hpaulj