2014-10-04 215 views
17

我正在寻找一个能够帮助我完成以下工作的单线解决方案。Numpy:根据索引数组重新排列数组

假设我有

array = np.array([10, 20, 30, 40, 50]) 

我想基于输入顺序重新安排它。如果有所谓的arrange一个numpy的功能,这将做到以下几点:

newarray = np.arrange(array, [1, 0, 3, 4, 2]) 
print newarray 

    [20, 10, 40, 50, 30] 

形式上,如果要重新排序的阵列的步骤为,而“索引”排列为1个XN,订货会被确定数组称为“索引”。

numpy是否有这样的功能?

回答

23

你可以简单地直接使用你的“指数”列表中,作为,以及,索引阵列:

>>> arr = np.array([10, 20, 30, 40, 50]) 
>>> idx = [1, 0, 3, 4, 2] 
>>> arr[idx] 
array([20, 10, 40, 50, 30]) 

它往往要快得多,如果idx已经是一个ndarray,而不是一个list,即使它将以任一方式工作:

>>> %timeit arr[idx] 
100000 loops, best of 3: 2.11 µs per loop 
>>> ai = np.array(idx) 
>>> %timeit arr[ai] 
1000000 loops, best of 3: 296 ns per loop 
+2

谢谢!如果“索引”是二维数组呢?例如,我想通过使用索引'[[1,2],[“a”,“b”]''变成'[[2,1],[“a”,“b”]] [1,0],[0,1]]'。我知道一个难看的方法是使用for循环来重新排列数组的每一行,使用索引数组的相应行。但是有一个更快的方法。 – Skywalker326 2016-06-29 08:04:29