逐行切割2-D阵列,具有来自相同形状阵列的相应行

时间:2016-12-30 06:49:21

标签: python numpy

考虑数组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]]

我希望通过aa进行适当的切片来生成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数组进行切片的合适方法是什么?

1 个答案:

答案 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]])