切片numpy数组vs选择单个元素

时间:2018-05-13 21:27:11

标签: python numpy

我有一个数组:

arr = np.array([[1,2,3], [4,5,6], [7,8,9]])

如果我对数组arr[:, :1]进行切片,那么结果为array([[1], [4], [7]])

如果我对数组arr[:, 0]进行切片,那么结果为array([1, 4, 7])

为什么会有区别?

2 个答案:

答案 0 :(得分:3)

:1是一个切片(恰好是长度为1),因此numpy返回数组中每一行(第一个暗淡)的列表。这就是为什么你有一个二维数组:你要求一个:的子数组。

另一方面,

0是一个索引,因此numpy会将结果缩小1维,从而得到一个值列表(更精确的维数为1的数组)。

答案 1 :(得分:0)

https://docs.scipy.org/doc/numpy-1.14.2/user/basics.indexing.html#single-element-indexing

声称单个元素索引的行为与通常的Python列表索引类似。切片也遵循这种模式

In [175]: arr = np.arange(6).reshape(2,3)
In [176]: arr
Out[176]: 
array([[0, 1, 2],
       [3, 4, 5]])

单个元素索引 - 返回1d数组

In [177]: arr[1,:]
Out[177]: array([3, 4, 5])

切片索引返回一个二维数组

In [178]: arr[:1,:]
Out[178]: array([[0, 1, 2]])

带有等效列表

In [179]: alist = arr.tolist()

单个元素索引返回一个列表:

In [180]: alist[1]
Out[180]: [3, 4, 5]

切片索引返回嵌套列表:

In [181]: alist[:1]
Out[181]: [[0, 1, 2]]

当我索引1d数组或数字列表时,相同的模式成立。

numpy将此概括为列和更高维度,但尝试保持模式不变。

In [187]: arr[:,0]
Out[187]: array([0, 3])
In [188]: arr[:,:1]
Out[188]: 
array([[0],
       [3]])
In [189]: [x[0] for x in alist]
Out[189]: [0, 3]
In [190]: [x[:1] for x in alist]
Out[190]: [[0], [3]]
相关问题