我有一个数组:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
如果我对数组arr[:, :1]
进行切片,那么结果为array([[1],
[4], [7]])
。
如果我对数组arr[:, 0]
进行切片,那么结果为array([1, 4, 7])
。
为什么会有区别?
答案 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]]