方法#1
获取argsort 索引,一次性选择沿第一个轴的所有元素,然后使用 NumPy 的advanced-indexing 沿第二个轴索引以获得重新排列的输出 -
idx = np.argsort(a[:,:,1])
a_out = a[np.arange(a.shape[0])[:,None], idx]
方法 #2
如果我们在输入数组中进行原位编辑(将结果写回输入),我们可以在预先计算那些 argsort 索引后运行一个循环,就像这样 -
idx = np.argsort(a[:,:,1])
for i,indx in enumerate(idx):
a[i] = a[i,indx]
基准测试
# Original method
In [130]: np.random.seed(0)
...: a = np.random.rand(100,100,100)
In [131]: %%timeit
...: for i in np.arange(np.shape(a)[0]):
...: idx = np.argsort(a[i,:,1])
...: a[i]=a[i,idx]
1000 loops, best of 3: 1.63 ms per loop
# Approach #1
In [132]: np.random.seed(0)
...: a = np.random.rand(100,100,100)
In [133]: %%timeit
...: idx = np.argsort(a[:,:,1])
...: a_out = a[np.arange(a.shape[0])[:,None], idx]
1000 loops, best of 3: 1.6 ms per loop
# Approach #2
In [134]: np.random.seed(0)
...: a = np.random.rand(100,100,100)
In [135]: %%timeit
...: idx = np.argsort(a[:,:,1])
...: for i,indx in enumerate(idx):
...: a[i] = a[i,indx]
1000 loops, best of 3: 1.24 ms per loop