基于另一个numpy数组重新排序numpy数组每行的列
我们有一个名为main\u arr的主数组,我们希望使用向导将其转换为另一个名为result的数组,其大小相同, 同样大小:基于另一个numpy数组重新排序numpy数组每行的列,numpy,array-broadcasting,Numpy,Array Broadcasting,我们有一个名为main\u arr的主数组,我们希望使用向导将其转换为另一个名为result的数组,其大小相同, 同样大小: import numpy as np main_arr = np.array([[3, 7, 4], [2, 5, 6]]) guide_arr = np.array([[2, 0, 1], [0, 2, 1]]) result = np.zeros(main_arr.shape) 我们需要的结果等于: if np.array_equal(result, np.arra
import numpy as np
main_arr = np.array([[3, 7, 4], [2, 5, 6]])
guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
result = np.zeros(main_arr.shape)
我们需要的结果等于:
if np.array_equal(result, np.array([[7, 4, 3], [2, 6, 5]])):
print('success!')
我们应该如何使用指南
guide_arr[0,0]是2,表示结果[0,2]=main_arr[0,0]
guide_arr[0,1]是0,表示结果[0,0]=main_arr[0,1]
guide_arr[0,2]是1,表示结果[0,1]=main_arr[0,2]
第1行也是如此
总之,main_arr中的项目应该重新排序(在一行内,行永不更改),以便它们的新列索引等于guide_arr中的数字
In [199]: main_arr = np.array([[3, 7, 4], [2, 5, 6]])
...: guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
...:
对列重新排序的常用方法是使用如下索引,其中,行的顺序不同:
In [200]: main_arr[np.arange(2)[:,None],guide_arr]
Out[200]:
array([[4, 3, 7],
[2, 6, 5]])
arange(2)[:,None]
是一个使用(2,3)索引数组进行广播的列数组
我们可以将同样的想法应用于使用指南\u arr
来识别结果中的列
:
In [201]: result = np.zeros_like(main_arr)
In [202]: result[np.arange(2)[:,None], guide_arr] = main_arr
In [203]: result
Out[203]:
array([[7, 4, 3],
[2, 6, 5]])
这可能会澄清广播的工作原理:
In [204]: np.broadcast_arrays(np.arange(2)[:,None], guide_arr)
Out[204]:
[array([[0, 0, 0],
[1, 1, 1]]),
array([[2, 0, 1],
[0, 2, 1]])]