你将如何有效地重新排列这个数组?

How would you reshuffle this array efficiently?

我有一个数组 arr_val,它在大量位置存储某个函数的值(为了说明,我们只取一个小的 4 个位置)。现在,假设我还有另一个数组 loc_array 存储函数的位置,并假设位置再次为相同的数字 4。但是,位置数组是多维数组,因此每个位置索引都具有相同的 4子位置索引,每个子位置索引是一对坐标。为了清楚地说明:

arr_val = np.array([1, 2, 3, 4])
loc_array = np.array([[[1,1],[2,3],[3,1],[3,2]],[[1,2],[2,4],[3,4],[4,1]], 
                     [[2,1],[1,4],[1,3],[3,3]],[[4,2],[4,3],[2,2],[4,4]]])

上面两个数组的意思就是一些感兴趣的参数的值,比如位置[1,1],[2,3],[3,1],[3,2]1,等等。但是,我有兴趣以不同的形式重新表达上面的相同内容,而不是随机点,我希望坐标采用以下易于处理的形式

coord = [[[1,1],[1,2],[1,3],[1,4]],[[2,1],[2,2],[2,3],[2,4]],[[3,1],[3,2], 
          [3,3],[3,4]],[[4,1],[4,2],[4,3],[4,4]]]

各个坐标的值给出为

val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]

对于大型 numpy 数组,实现上述目标的一种非常有效的方法是什么?

它可能不是你想要的答案,但它仍然有效。

val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
temp= ""
int_list = []

for element in val:
    temp_int = temp.join(map(str, element ))
    int_list.append(int(temp_int))

int_list.sort()
print(int_list)

## result ##
[1132, 1233, 2444, 3412]
  • 把每个elementarray改成int构造int_list
  • 排序int_list
  • int_list
  • 构建2D np.array

我跳过了最后一部分。你可以在网上找到方法。

您可以像这样使用 lexsort

>>> order = np.lexsort(loc_array.reshape(-1, 2).T[::-1])
>>> arr_val.repeat(4)[order].reshape(4, 4)
array([[1, 2, 3, 3],
       [3, 4, 1, 2],
       [1, 1, 3, 2],
       [2, 4, 4, 4]])

如果您确定 loc_array 是所有可能位置的排列,那么您可以避免排序:

>>> out = np.empty((4, 4), arr_val.dtype)
>>> out.ravel()[np.ravel_multi_index((loc_array-1).reshape(-1, 2).T, (4, 4))] = arr_val.repeat(4)
>>> out
array([[1, 2, 3, 3],
       [3, 4, 1, 2],
       [1, 1, 3, 2],
       [2, 4, 4, 4]])