2017-06-20 286 views
1

我想我正确理解python/numpy中数组的索引。但今天我遇到了一个问题,如下所示:python numpy数组索引

我有一个6维阵列,例如AA.shape = (11,1,9,1,5,7)。 然后,我使用索引如下:

B = A[:,0,0,0,[3,4,2],0] 

B.shape = (11,3)和如预期;

C = A[:,0,0,0,[3,4,2],:] 

and C.shape = (11,3,7) as expected;

但是,当我说:

D = A[:,0,:,0,[3,4,2],0] 

D.shape(11,9,3)我可以期待,不过,蟒蛇返回D.shape = (3, 11, 9)

而我对数组D的形状非常困惑。

有没有人可以给我一个简短的解释? 非常感谢!

+1

有大约混合片,并列出了'基本与advanced'索引文档的部分。有一些不明确的地方,'numpy'选择将切片尺寸放在最后。在以前的SO问题中也讨论过这种行为。 – hpaulj

+0

[Explain slice notation]的可能重复(https://stackoverflow.com/questions/509211/explain-slice-notation) – polka

+0

不,这不仅仅是一个普通的切片问题。这是更微妙的东西。 – hpaulj

回答

2

https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

A[:,0,:,0,[3,4,2],0] 

索引与 '高级' 列表讨论的,[3,4,2]产生大小3的尺寸。之后添加第一个和第三个维度,形成(3,11,9)形状。

这种行为有些争议,尤其是当其他指标是标量时。当有两个索引列表时,文档中给出的理由更加清晰。

Numpy sub-array assignment with advanced, mixed indexing

+0

嗨hpaulj,非常感谢答复。现在我明白了在使用slice和seq的组合时要小心的地方。整数。 – zlpython

+0

对于数组B和C,切片也被用于(但仅限于第一维和最后一维)并与其他标量索引组合使用,这些索引以我通常可以预期的方式工作。但是,对于数组D,在标量索引之间使用了切片,我想这是导致数组形状导致其他行为的原因。但是关于这个语法,它仍然很容易被混淆。 – zlpython