Python Numpy高级选择不工作

Python Numpy高级选择不工作,python,numpy,multidimensional-array,matrix-indexing,Python,Numpy,Multidimensional Array,Matrix Indexing,有人能帮我理解为什么高级选择有时不起作用,以及我能做些什么让它起作用(第二种情况) 你想要 b[np.ix_([0, 1], [0, 1, 2])] 您还需要对b[[0,1],[0,1]]执行相同的操作,因为这并不是您所认为的: b[np.ix_([0, 1], [0, 1])] 这里的问题是,高级索引所做的事情与您认为的完全不同。您错误地认为b[[0,1],[0,1,2]意味着“取b[i,j]的所有部分,其中i是0或1,j是0、1或2”。考虑到在索引表达式中有一个列表时它似乎是这样工作的

有人能帮我理解为什么高级选择有时不起作用,以及我能做些什么让它起作用(第二种情况)

你想要

b[np.ix_([0, 1], [0, 1, 2])]
您还需要对
b[[0,1],[0,1]]
执行相同的操作,因为这并不是您所认为的:

b[np.ix_([0, 1], [0, 1])]

这里的问题是,高级索引所做的事情与您认为的完全不同。您错误地认为
b[[0,1],[0,1,2]
意味着“取
b[i,j]
的所有部分,其中
i
是0或1,
j
是0、1或2”。考虑到在索引表达式中有一个列表时它似乎是这样工作的,这是一个合理的错误,如

b[:, [1, 3, 5], 2]
事实上,对于数组
A
和一维整数数组
I
J
A[I,J]
是一个数组,其中

A[I, J][n] == A[I[n], J[n]]
这以自然的方式推广到更多的索引数组,例如

A[I, J, K][n] == A[I[n], J[n], K[n]]
对于高维索引数组,如果
I
J
是二维的,那么

A[I, J][m, n] == A[I[m, n], J[m, n]]
它还将广播规则应用于索引数组,并将索引中的列表转换为数组。这比你预期的要强大得多,但这意味着要做你想做的事情,你需要

b[[[0],
   [1]], [[0, 1, 2]]]

np.ix
是一个帮助器,可以帮您完成这项工作,这样您就不必写十几个括号。

我想您误解了本例的高级选择语法。我用了你的例子,只是把它缩小了,更容易看

import numpy as np
b = np.random.rand(5, 4, 3, 2)

# advanced selection works as expected
print b[[0,1],[0,1]]   # http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
                       # this picks the two i,j=0 (a 3x2 matrix) and i=1,j=1, another 3x2 matrix

# doesn't work - why?
#print  b[[0,1],[0,1,2]]   # this doesnt' work because [0,1] and [0,1,2] have different lengths

print b[[0,1,2],[0,1,2]]  # works
输出:

[[[ 0.27334558  0.90065184]
  [ 0.8624593   0.34324983]
  [ 0.19574819  0.2825373 ]]

 [[ 0.38660087  0.63941692]
  [ 0.81522421  0.16661912]
  [ 0.81518479  0.78655536]]]
[[[ 0.27334558  0.90065184]
  [ 0.8624593   0.34324983]
  [ 0.19574819  0.2825373 ]]

 [[ 0.38660087  0.63941692]
  [ 0.81522421  0.16661912]
  [ 0.81518479  0.78655536]]

 [[ 0.65336551  0.1435357 ]
  [ 0.91380873  0.45225145]
  [ 0.57255923  0.7645396 ]]]

你认为
b[[0,1],[0,1,2]
应该做什么?如果您希望这样做有效,那么
b[[0,1],[0,1]]
很可能也没有做您想做的事情,您只是因为没有嘈杂的错误消息而没有注意到。对于初学者来说,它根本不应该导致错误。此索引应该从维度
0
中选择元素
0
1
,和
0
1
2
从维度
1
(和
切片(无)
,用于其他后续维度)。感谢您的全面而深刻的解释!但是,当我的选择中有“:”时,我如何使用np.ix。示例a[:,[0,1],[0,1,2]]当我尝试a[:,np.ix([0,1],[0,1,2])时,它只是抱怨。@Nozdrum:使用
np.arange(a.shape[0])
而不是
(带
np.ix
),或者使用
:2
:3
而不是
[0,1]/code>(不带
)。混合使用基本索引和高级索引既奇怪又棘手;除了最简单的情况外,在所有情况下,最好将基本索引和高级索引分开。@user2357112谢谢你的回答,我的问题是它变得不可读。就像真的不可读一样。我有很多这样的行:delay[:,:,index,range_I[:5]]=channels.delay[:,:,index,range_j[5:10];这一次,我认为matlab比numpy做得更好。@Nozdrum:它可以帮助重新排列
delay
通道的轴。delay
将需要应用高级索引的轴放在最前面。然后你可以省略
s。(您可以使用
np.transpose
创建轴重新排列视图,并保持
delay
channels.delay
的原始形状。)查看Matlab如何处理此问题后,我完全同意Matlab使您所需的操作更容易。
import numpy as np
b = np.random.rand(5, 4, 3, 2)

# advanced selection works as expected
print b[[0,1],[0,1]]   # http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
                       # this picks the two i,j=0 (a 3x2 matrix) and i=1,j=1, another 3x2 matrix

# doesn't work - why?
#print  b[[0,1],[0,1,2]]   # this doesnt' work because [0,1] and [0,1,2] have different lengths

print b[[0,1,2],[0,1,2]]  # works
[[[ 0.27334558  0.90065184]
  [ 0.8624593   0.34324983]
  [ 0.19574819  0.2825373 ]]

 [[ 0.38660087  0.63941692]
  [ 0.81522421  0.16661912]
  [ 0.81518479  0.78655536]]]
[[[ 0.27334558  0.90065184]
  [ 0.8624593   0.34324983]
  [ 0.19574819  0.2825373 ]]

 [[ 0.38660087  0.63941692]
  [ 0.81522421  0.16661912]
  [ 0.81518479  0.78655536]]

 [[ 0.65336551  0.1435357 ]
  [ 0.91380873  0.45225145]
  [ 0.57255923  0.7645396 ]]]