gpt4 book ai didi

python - 如何有效地重新洗牌这个数组?

转载 作者:行者123 更新时间:2023-12-01 09:27:12 26 4
gpt4 key购买 nike

我有一个数组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 数组来说,实现上述目标的非常有效的方法是什么?

最佳答案

您可以像这样使用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]])

关于python - 如何有效地重新洗牌这个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com