在Numpy中使用两个索引进行逻辑索引(如MATLAB)
我想知道怎么用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)]
。