索引numpy多维数组取决于切片方法

Evg*_*tov 3 python numpy slice multidimensional-array

我有一个三维数组.当我采用它的2-D切片时,结果取决于它是用列表索引还是用切片索引.在第一种情况下,结果是转置的.没有在手册中找到此行为.

>>> import numpy as np
>>> x = np.array([[[1,1,1],[2,2,2]], [[3,3,3],[4,4,4]]])
>>> x
array([[[1, 1, 1],
        [2, 2, 2]],
       [[3, 3, 3],
        [4, 4, 4]]])
>>> x[0,:,[0,1]]
array([[1, 2],
       [1, 2]])
>>> x[0,:,slice(2)]
array([[1, 1],
       [2, 2]])
>>> 
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出这个理由吗?

jua*_*aga 5

因为您在使用时实际上使用了高级索引[0,1].来自文档:

结合高级和基本索引

当至少有一个slice(:),省略号(...)或np.newaxis索引(或者数组的维度多于高级索引)时,行为可能会更复杂.这就像连接每个高级索引元素的索引结果一样

在最简单的情况下,只有一个高级索引.单个高级索引可以例如替换切片,并且结果数组将是相同的,但是,它是副本并且可以具有不同的存储器布局.当可能时,切片是优选的.

注意我上面加粗的两个部分.

特别是在这种结构中:

>>> x[0,:,[0,1]]
array([[1, 2],
       [1, 2]])
Run Code Online (Sandbox Code Playgroud)

在索引中至少有一次"slice,ellipsisi或np.newaxis"的情况下,行为就像连接每个高级索引元素的索引结果一样.所以:

>>> x[0,:,[0]]
array([[1, 2]])
>>> x[0,:,[1]]
array([[1, 2]])
>>> np.concatenate((x[0,:,[0]], x[0,:,[1]]))
array([[1, 2],
       [1, 2]])
Run Code Online (Sandbox Code Playgroud)

但是,这种结构就像一个简单的例子:只有一个高级索引,所以它就像一个切片:

>>> x[0,:,slice(2)]
array([[1, 1],
       [2, 2]])
>>> x[slice(0,1),:,slice(2)]
array([[[1, 1],
        [2, 2]]])
Run Code Online (Sandbox Code Playgroud)

虽然注意,后者实际上是三维的,因为索引的第一部分充当切片,它是3个切片,所以三个维度.

  • 在http://stackoverflow.com/questions/36207850/numpy-sub-array-assignment-with-advanced-mixed-indexing中,我找到了针对"[标量,切片,列表]"索引的错误/问题的链接.有关更多SO讨论,请搜索"[numpy] advanced-and-basic-indexing". (2认同)