在Numpy中使用两个索引进行逻辑索引(如MATLAB)

2 投票
1 回答
3942 浏览
提问于 2025-04-17 21:58

我想知道怎么用Numpy实现MATLAB中的这种索引方式。

X=magic(5);
M=[0,0,1,2,1];
X(M==0,M==2)

这样做会返回:

ans =
  8
 14

我发现用Numpy这样做是不对的,因为结果和MATLAB的不一样。

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)

我得到的是:

 matrix([[24, 24, 24, 24, 24]])

那么在Numpy中,用两个索引进行逻辑索引的正确方法是什么呢?

1 个回答

8

一般来说,当 X[a, b] 中的 a 和 b 都是数组(在 matlab 中叫向量)时,有两种方式来理解这个表达式,分别是“外部索引”和“内部索引”。

matlab 的设计者选择了“外部索引”,而 numpy 的设计者则选择了“内部索引”。如果你想在 numpy 中使用“外部索引”,可以这样做:

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

为了完整起见,你也可以在 matlab 中通过以下方式实现“内部索引”:

X(sub2ind(size(X), a, b))
# This is roughly equal to numpy's
X[a, b]

简单来说,可以尝试 X[np.ix_(M == 0, M == 1)]

撰写回答