您的示例---将标量或 0D---布尔掩码应用于一维数组会产生
print(a[True])
# [[0 1 2 3 4]]
print(a[False])
# []
为了清楚起见,尤其是 w.r.t.第二个(False)案例让我们查询形状
print(a[True].shape)
# (1, 5)
print(a[False].shape)
# (0, 5)
现在乍一看有点令人费解。为什么是额外维度?
让我们从一个不太前卫的案例开始,弄清楚为什么这是合乎逻辑的行为:
x = np.arange(6).reshape(3,2)
m2 = np.array([[True,False],[True,True],[False,True]])
m1 = np.array([True,False,True])
m0 = np.array(True)
我们创建了一个 2D 数组并匹配 2D、1D 和 0D 掩码。
使用 2D 蒙版进行蒙版会产生 1D 结果
x[m2]
# array([0, 2, 3, 5])
使用 1D 掩码进行掩码会选择整行,因此会给出 2D 结果
x[m1]
# array([[0, 1],
# [4, 5]])
我们也可以在更高的维度上验证,从掩码中删除一个维度会使结果增加一。
因此,使用 0D 进行掩码确实比我们开始时多获得一维是合乎逻辑的。 2D 掩码选择单个点(0D -> 这些点的列表:1D),1D 掩码选择整行(1D -> 这些点的列表:2D);因此,0D 蒙版应该并且确实会选择整个工作表(2D -> 列表:3D);因为基本数组是 2D 的,所以一张表就是它的全部。
x[m0]
# array([[[0, 1],
# [2, 3],
# [4, 5]]])
x[m0].ndim
# 3
一般:
x[m2].ndim == x.ndim - m2.ndim + 1
# True
x[m1].ndim == x.ndim - m1.ndim + 1
# True
x[m0].ndim == x.ndim - m0.ndim + 1
# True