使用两个索引在Numpy中进行逻辑索引,如MATLAB中所示

lin*_*llo 2 python indexing matlab numpy

如何使用Numpy复制在MATLAB中完成的索引?

X=magic(5);
M=[0,0,1,2,1];
X(M==0,M==2)
Run Code Online (Sandbox Code Playgroud)

返回:

ans =
  8
 14
Run Code Online (Sandbox Code Playgroud)

我发现在Numpy中这样做是不正确的,因为它不会给我相同的结果..

X = np.matrix([[17, 24,  1,  8, 15],
        [23,  5,  7, 14, 16],
        [ 4,  6, 13, 20, 22],
        [10, 12, 19, 21,  3],
        [11, 18, 25,  2,  9]])

M=array([0,0,1,2,1])
X.take([M==0]).take([M==2], axis=1)
Run Code Online (Sandbox Code Playgroud)

因为我得到:

 matrix([[24, 24, 24, 24, 24]])
Run Code Online (Sandbox Code Playgroud)

在numpy中使用两个索引进行逻辑索引的正确方法是什么?

Bi *_*ico 7

一般来说,X[a, b]当a和b都是数组(matlab中的向量),"内部样式"索引或"外部样式"索引时,有两种方法可以解释.

matlab的设计者选择了"外部式"索引,numpy的设计者选择了内部式索引.要在numpy中进行"外部风格"索引,可以使用:

X[np.ix_(a, b)]
# This is roughly equal to matlab's
X(a, b)
Run Code Online (Sandbox Code Playgroud)

对于完整性,你可以通过以下方式在matlab中进行"内部风格"索引:

X(sub2ind(size(X), a, b))
# This is roughly equal to numpy's
X[a, b]
Run Code Online (Sandbox Code Playgroud)

总之,试试吧X[np.ix_(M == 0, M == 1)].