2013-10-06 31 views
2

我的问题是关于numpy中的数组切片。以下行为的逻辑是什么?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是一个2-d数组,它包含行0和1的值,列0

+0

这是超级方便有像切片'y2'是一维数组,例如,如果你想拉出一个阵列的每一列绘制它或者通过额外的信号处理运行它,等。 – tacaswell

回答

3

这遵循标准的Python约定。看看这些类似的表达式的结果:

>>> a = [0, 1, 2, 3, 4, 5] 
>>> a[4] 
4 
>>> a[4:5] 
[4] 

正如你所看到的,一个返回一个项目,而其他的回报包含一个项目列表。这一直是python的工作方式,numpy只是遵循这个约定,但在更高维度上。无论何时传递片段而不是单个项目,都会返回一个列表;即使有列表中没有的项目,这是真实的,要么是因为年底指数过低,或者因为起始索引太高:

>>> a[4:4] 
[] 
>>> a[6:6] 
[] 

所以在所有情况下,通过一个片均值“返回序列(沿着给定维度)“,而传递整数意味着”返回单个项目(沿给定维度)“。

5

你可以得到你预期的行为做x[0:2, 0:1],即用一个单一的项目片。但是,无论何时选择单个元素,该维度都会折叠。你可能不喜欢它,但是如果你仔细想一想,你应该意识到它是最一致的行为:按照你的逻辑,x[0, 0]将是1行1列的二维数组,而不是存储在位置。

2

当您使用单个元素而不是切片访问数组时,它会折叠该维度。因此,如果你有

x = arange(25) 
y = x[10] 

你会期望y10而不是array([10])

所以,如果你使用

y2 = x[0:2, 0] 
print y2.shape 
(2,) 

它会崩溃的第二个维度。如果要保留第二个维度,则需要使用切片访问该维度。

y2 = x[0:2, 0:1] 
print y2.shape 
(2, 1) 
相关问题