3

我的问题是关于 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 行和第 1 行第 0 列中的值。

4

3 回答 3

5

您可以获得预期的行为x[0:2, 0:1],即使用单个项目切片。但是,只要选择了单个元素,该维度就会折叠。您可能不喜欢它,但如果您稍微考虑一下,您应该意识到这是最一致的行为:按照您的逻辑,x[0, 0]将是一个 1 行 1 列的二维数组,而不是存储在该位置的项目.

于 2013-10-06T22:08:55.637 回答
4

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

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

如您所见,一个返回一个 item,而另一个返回一个包含一个 item 的列表。这始终是 python 的工作方式,numpy 只是遵循该约定,但在更高的维度上。每当您传递一个切片而不是单个项目时,都会返回一个列表;即使列表中没有项目也是如此,要么是因为结束索引太低,要么是因为起始索引太高:

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

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

于 2013-10-06T22:09:24.160 回答
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)
于 2013-10-06T22:10:47.243 回答