如何将数组中的值列表重新映射到 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])
假设我们有初始数组:
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])