假设我在matlab中有一个矩阵a
,而在b
中有一个向量a =
2 1 1
3 3 1
3 2 2
b =
1 3 2
,如下所示:
sort
使用matlab的[n idx] = sort(b)
n =
1 2 3
idx =
1 3 2
anew = a(idx,idx)
anew =
2 1 1
3 2 2
3 1 3
函数,我可以实现以下目的:
a = np.array([[2,1,1],[3,3,1],[3,2,2]])
b = [0,2,1]
idx = [i[0] for i in sorted(enumerate(b), key=lambda x:x[1])]
现在,我想在python中做同样的事情。我的尝试:
anew
问题在于我无法像使用Matlab那样找到构建anew=a[idx]
anew
array([[2, 1, 1],
[3, 2, 2],
[3, 3, 1]])
矩阵的方法。我试过了:
{{1}}
正如你所看到的结果(matlab与python)不一样。
任何提示?
答案 0 :(得分:2)
numpy
具有高级索引,因此在两个维度上直接使用idx
将触发高级索引,结果将为1d数组;要以交叉产品方式进行索引,您需要使用np.ix_
来构建索引网格,如文档中所述:
使用
ix_
可以快速构建索引数据的索引数组 交叉产品。
a[np.ix_(idx, idx)]
#array([[2, 1, 1],
# [3, 2, 2],
# [3, 1, 3]])
或者另一个选项是分两步进行切片:
a[idx][:,idx]
#array([[2, 1, 1],
# [3, 2, 2],
# [3, 1, 3]])