考虑数组a
np.random.seed([3,1415])
a = np.random.choice(np.arange(8), (2, 4), False)
print(a)
[[7 1 4 5]
[6 2 3 0]]
我将创建另一个数组b
,用于保存每行np.argsort
的结果。
b = a.argsort(1)
print(b)
[[1 2 3 0]
[3 1 2 0]]
我希望通过a
与a
进行适当的切片来生成b
的排序版本。看起来应该是这样的
idx0 = np.arange(a.shape[0]).repeat(a.shape[1])
print(a[idx0, b.ravel()].reshape(a.shape))
[[1 4 5 7]
[0 2 3 6]]
问题
以上述方式将2 x 4
数组与另一个2 x 4
数组进行切片的合适方法是什么?
答案 0 :(得分:2)
Advanced-indexing
寻求帮助 -
a[np.arange(b.shape[0])[:,None],b]
示例运行 -
In [10]: a
Out[10]:
array([[7, 1, 4, 5],
[6, 2, 3, 0]])
In [11]: b
Out[11]:
array([[1, 2, 3, 0],
[3, 1, 2, 0]])
In [12]: a[np.arange(b.shape[0])[:,None],b]
Out[12]:
array([[1, 4, 5, 7],
[0, 2, 3, 6]])