如何将数组中的值列表重新映射到 NumPy 中的另一个值列表?

How to remap list of values from an array to another list of values in NumPy?

假设我们有初始数组:

test_array = np.array([1, 4, 2, 5, 7, 4, 2, 5, 6, 7, 7, 2, 5])

使用另外两个数组重新映射此数组中的元素的最佳方法是什么,一个代表我们要替换的元素,第二个代表替换它们的新值:

map_from = np.array([2, 4, 5])
map_to = np.array([9, 0, 3])

所以结果应该是:

remaped_array = [1, 0, 9, 3, 7, 0, 9, 3, 6, 7, 7, 9, 3]

可能有更简洁的方法来执行此操作,但这应该通过使用遮罩来实现。

mask = test_array[:,None] == map_from
val = map_to[mask.argmax(1)]
np.where(mask.any(1), val, test_array)

输出:

array([1, 0, 9, 3, 7, 0, 9, 3, 6, 7, 7, 9, 3])

如果你的原始数组只包含正整数并且它们的最大值不是很大,使用映射数组最简单:

>>> a = np.array([1, 4, 2, 5, 7, 4, 2, 5, 6, 7, 7, 2, 5])
>>> mapping = np.arange(a.max() + 1)
>>> map_from = np.array([2, 4, 5])
>>> map_to = np.array([9, 0, 3])
>>> mapping[map_from] = map_to
>>> mapping[a]
array([1, 0, 9, 3, 7, 0, 9, 3, 6, 7, 7, 9, 3])

这是另一种通用方法:

>>> vals, inv = np.unique(a, return_inverse=True)
>>> vals[np.searchsorted(vals, map_from)] = map_to
>>> vals[inv]
array([1, 0, 9, 3, 7, 0, 9, 3, 6, 7, 7, 9, 3])