NumPy中数组之间的映射

3
我有一个数组中的数据,想将其映射到另一个数组中,给定一个对应关系数组:
  • originaldata是一个numpy 2D数组,
  • targetdata是另一个numpy 2D数组,
  • mapping是一个用于映射位置的数组,因此mapping[x,y]会给出targetdata[x,y]的数据来自于originaldata的哪个坐标对。
目前,我正在执行以下操作:
for (x,y) in ALLTHEPOINTS:
    targetdata[x,y]=originaldata[mapping[x,y][0],mapping[x,y][1]]

我怀疑这种方法非常低效。

有没有办法对其进行向量化?或者是否有任何numpy函数可以处理此类操作?


1
你确定你的代码没问题吗?应该是targetdata[x,y]=originaldata[mapping[x, y, 0],mapping[x, y, 1]]吧? - Bi Rico
@BiRico 哦,对不起,我会编辑的。我只是凭记忆写的... - chaos.ct
那么 mapping 是一个三维数组,即 (X, Y, 2),还是元组数组或类似的东西? - Bi Rico
Numpy有一个vectorize函数,但它不是魔法般的高速精灵,只是一些for循环的包装器。无论如何,它是一个很好的基准;如果分析表明需要担心性能问题时再考虑其他方法。 - Nick T
1个回答

6
这就是高级索引的用途所在:
targetdata = originaldata[mapping[..., 0], mapping[..., 1]]

作为一个简单的例子:
>>> original_data = np.arange(6).reshape(2, 3)
>>> original_data
array([[0, 1, 2],
       [3, 4, 5]])
>>> mapping = np.array([[[1,0], [1, 1], [1, 2]],   # swap rows and reverse
...                     [[0, 2], [0, 1], [0, 0]]]) # the second one
>>> original_data[mapping[..., 0], mapping[..., 1]]
array([[3, 4, 5],
       [2, 1, 0]])

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