如何使用另一个2D数组作为映射,将2D numpy数组映射到1D数组?

4

我有两个2D的numpy数组,data包含了实际的样本数据:

[[12 15  5  0]
 [ 3 11  3  7]
 [ 9  3  5  2]
 [ 4  7  6  8]]

另一个名为location的数组包含了一个地图,它是一个新的一维数组中唯一、不重叠的整数值对应的二维数组,大小与前两个数组相同:

[[ 5  6  9 10]
 [ 4  7  8 11]
 [ 3  2 13 12]
 [ 0  1 14 15]]

到目前为止,我唯一能够运行传输的方法是使用简单的for循环:
arr = np.zeros(4*4, dtype = int)

for i in range(4):
    for j in range(4):
        mapval = location[i, j]
        arr[mapval] = data[i, j]

正确输出的是[ 4 7 3 9 3 12 15 11 3 5 0 7 2 5 6 8]

这对于简单的4*4数组来说很好,但实际数据集大小为512 * 512,这种方法完成起来需要很长时间。所以我的问题是,是否有任何函数或方法利用ufuncs / numpy的快速处理能力更有效地完成此操作?


你的地图描述了 希尔伯特曲线 吗? - High Performance Mark
是的,实际上它确实可以! - user8279174
在零初始化之后,直接使用赋值语句 arr[location] = data 如何? - Divakar
1个回答

2

您需要对位置数组进行排序的索引,以重新排列数据数组,可以使用argsort计算:

data.ravel()[location.ravel().argsort()]
# array([ 4,  7,  3,  9,  3, 12, 15, 11,  3,  5,  0,  7,  2,  5,  6,  8])

import numpy as np
data = np.array([[12, 15,  5,  0],
 [ 3, 11,  3,  7],
 [ 9,  3,  5,  2],
 [ 4,  7,  6,  8]])

location = np.array([[ 5,  6,  9, 10],
 [ 4,  7,  8, 11],
 [ 3,  2, 13, 12],
 [ 0,  1, 14, 15]])

1
以前没有遇到过ravel方法,但这个方法很好用,现在更有理由深入研究文档了。谢谢! - user8279174

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接