我的问题是关于numpy中的数组切片。以下行为的逻辑是什么?
x = arange(25)
x.shape = (5, 5)
# This results in a 2-d array in which rows and columns are excerpted from x
y = x[0:2, 0:2]
# But this results in a 1-d array
y2 = x[0:2, 0]
我原本期望y2是一个二维数组,其中包含第0行和第0行第0列的值。
答案 0 :(得分:5)
您可以使用x[0:2, 0:1]
获得预期的行为,即使用单个项目切片。但是,只要选择了单个元素,该尺寸就会折叠。您可能不喜欢它,但如果您仔细考虑它,您应该意识到它是最一致的行为:遵循您的逻辑,x[0, 0]
将是1行1列的2d数组,而不是存储在该位置的项目。
答案 1 :(得分:3)
这遵循标准的Python约定。看看这些类似表达式的结果:
>>> a = [0, 1, 2, 3, 4, 5]
>>> a[4]
4
>>> a[4:5]
[4]
如您所见,一个返回一个项目,而另一个返回一个包含一个项目的列表。这总是python的工作方式,而numpy只是遵循这个约定,但是更高的维度。无论何时传递切片而不是单个项目,都会返回一个列表;即使列表中没有项目也是如此,因为结束索引太低,或者因为起始索引太高:
>>> a[4:4]
[]
>>> a[6:6]
[]
因此,在所有情况下,传递切片意味着“返回一个序列(沿着给定的维度)”,而传递整数则意味着“返回单个项目(沿着给定的维度)”。
答案 2 :(得分:2)
使用单个元素而不是切片访问数组时,它将折叠该维度。因此,如果你有
x = arange(25)
y = x[10]
您希望y
为10
,而不是array([10])
。
所以,如果你使用
y2 = x[0:2, 0]
print y2.shape
(2,)
它将折叠第二个维度。如果要保留第二个维度,则需要使用切片访问该维度。
y2 = x[0:2, 0:1]
print y2.shape
(2, 1)