我有一个2D数组:
>>> in_arr = np.array([[1,2],[4,3]])
array([[1, 2],
[4, 3]])
我按列找到排序的索引以产生另一个2D数组:
>>> col_sort = np.argsort(in_arr, axis=1)
array([[0, 1],
[1, 0]])
我想知道有效的numpy切片将第一个索引到第二个:
>>> redordered_in_arr = np.*SOME_SLICE_METHOD*(in_arr, col_sort, axis=1)
array([[1, 2],
[3, 4]])
然后意图是按列对数组执行(更复杂的)函数,例如:
>>> arr_with_function = reordered_in_arr ** np.array([1,2])
array([[1, 4],
[3, 16]])
并将元素返回到数组中的原始位置
>>> return_order = np.argsort(col_sort, axis=1)
>>> redordered_in_arr = np.*SOME_SLICE_METHOD*(arr_with_function, return_order, axis=1)
array([[1, 4],
[16, 3]])
好的,所以当我输入时我会考虑使用apply_over_axis,但我仍然希望知道如何在以后有效的情况下使用它...
答案 0 :(得分:2)
如果您想要就地执行所有这些操作,则不需要argsort()
。 Numpy在这种情况下支持就地操作:
In [12]: in_arr = np.array([[1,2],[4,3]])
In [13]: in_arr.sort(axis=1)
In [14]: in_arr **= [1, 2]
In [15]: in_arr
Out[15]:
array([[ 1, 4],
[ 3, 16]])
但是如果您需要已排序项目的索引,您可以通过简单的索引获得预期结果。
In [18]: in_arr[np.arange(2)[:,None], col_sort]
Out[18]:
array([[1, 2],
[3, 4]])