首页 > 解决方案 > Python:使用索引数组在两个数组之间进行映射

问题描述

我有一个 numpy 数组

src = np.random.rand(320,240)

和另一个大小为 (2 x (320*240)) 的 numpy 数组idx。每列idx索引结果数组中的一个条目dst,例如,idx[:,20] = [3,10]引用第 3 行第 10 列,dst并且假设20对应于 的展平索引src,即建立和idx的条目之间的映射。假设用全零初始化,我如何在没有循环的情况下将条目复制到它们的目的地?srcdstdstsrcdst

标签: pythonnumpy

解决方案


这是执行此操作的规范方法:

>>> import numpy as np
>>> 
>>> src = np.random.rand(4, 3)
>>> src
array([[0.0309325 , 0.72261479, 0.98373595],
       [0.06357406, 0.44763809, 0.45116039],
       [0.63992938, 0.6445605 , 0.01267776],
       [0.76084312, 0.61888759, 0.2138713 ]])
>>> 
>>> idx = np.indices(src.shape).reshape(2, -1)
>>> np.random.shuffle(idx.T)
>>> idx
array([[3, 3, 0, 1, 0, 3, 1, 1, 2, 2, 2, 0],
       [1, 2, 2, 0, 1, 0, 1, 2, 2, 1, 0, 0]])
>>> 
>>> dst = np.empty_like(src)
>>> dst[tuple(idx)] = src.ravel()
>>> dst
array([[0.2138713 , 0.44763809, 0.98373595],
       [0.06357406, 0.63992938, 0.6445605 ],
       [0.61888759, 0.76084312, 0.01267776],
       [0.45116039, 0.0309325 , 0.72261479]])

如果您不能确定这idx是一个正确的 shuffle,那么使用np.full不出现在src而不是np.empty.

>>> dst = np.full_like(src, np.nan)
>>> dst[tuple(idx)] = src.ravel()
>>> 
>>> dst
array([[0.27020869, 0.71216066,        nan],
       [0.63812283, 0.69151451, 0.65843901],
       [       nan, 0.02406174, 0.47543061],
       [0.05650845,        nan,        nan]])

如果您发现 中的填充值dst,则说明有问题idx


推荐阅读