我正在弄乱二维切片并且不明白为什么省略一些默认值会从原始数组中获取相同的值但产生不同的输出。双括号和形状变化的原因是什么?
x = np.arange(9).reshape(3,3)
y = x[2]
z = x[2:,:]
print y
print z
print shape(y)
print shape(z)
[6 7 8]
[[6 7 8]]
(3L,)
(1L, 3L)
答案 0 :(得分:1)
x
是一个二维数组,是NumPy的ndarray
对象的一个实例。您可以通过两种方式索引/切片这些对象:基本和高级。
y[2]
获取数组索引2处的行,返回数组[6 7 8]
。您正在执行基本切片,因为您只指定了一个整数。您还可以指定切片对象和整数的元组以进行基本切片,例如: x[:,2]
选择右侧列。
使用基本切片,您还可以减少返回对象的维数(在这种情况下,从两个减少到一个):
整数i返回与i:i + 1相同的值,但返回对象的维度减少1。
因此,当您要求y
的形状时,这就是为什么您只返回一个维度(来自您的二维x
)。
ndarray
:或具有至少一个序列对象或ndarray
的元组时,会发生 高级切片。这是x[2:,:]
的情况,因为2:
计为序列对象。
你找回ndarray
。当你要求它的形状时,你会得到所有的尺寸(在这种情况下是两个):
输出的形状(或用于设置的对象所需的形状)是广播的形状。
简而言之,只要您使用:
开始沿阵列的任何维度切片,就会进行高级切片而不是基本切片。
值得一提的一个简短点:基本切片将视图返回到原始数组(对y
所做的更改将反映在x
)中。高级切片返回一个全新的数组副本。
您可以更详细地了解数组索引和切片here。