代码:
import numpy as np
a = np.arange(5)
print(a[True])
print(a[False])
结果:
[[0 1 2 3 4]]
[]
对于上述代码,当我将True传递给numpy数组的索引时,它会返回完整的数组,而当传递False时,则返回一个空数组。背后发生了什么?
代码:
import numpy as np
a = np.arange(5)
print(a[True])
print(a[False])
结果:
[[0 1 2 3 4]]
[]
print(a[True])
# [[0 1 2 3 4]]
print(a[False])
# []
为了更清楚,特别是针对第二个(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)
x[m2]
# array([0, 2, 3, 5])
使用一维掩码进行掩蔽会选择整行,从而生成二维结果。
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
[0,1,2,3,4]
还是[[0,1,2,3,4]]
? - Paul Panzer