用相应的值替换 Numpy 数组中多次出现的元素集
Replace set of multiple occurring elements in Numpy array with corresponding values
请考虑以下代码:
arr = np.array([0, 1, 3, 5, 5, 6, 7, 9, 8, 9, 3, 2, 4, 6])
mapping = np.array([0, 10, 20, 30, 40, 55, 66, 70, 80, 90])
res = np.zeros_like(arr)
min_val = 0
max_val = 10
for val in range(min_val, max_val):
res[arr == val] = mapping[val]
print(res)
Numpy 数组 arr
可以多次出现区间 [min_val, max_val)
中的整数。 mapping
数组将具有每个整数的映射,mapping
数组的大小将为 max_val
。 res
数组是结果数组。
for
循环将 arr
中多次出现的元素替换为 mapping
中的相应值。例如,arr
中的 0
值将替换为 mapping[0]
,而 arr
中的 5
将替换为 mapping[5]
。
以上代码运行结果如下
[ 0 10 30 55 55 66 70 90 80 90 30 20 40 66]
问题:如何使用 Numpy 而不是 for
循环来执行此操作?
答案是用Numpy的fancy indexing
您可以简单地使用 arr
作为 mapping
的索引数组:
mapping[arr]
输出是
[ 0 10 30 55 55 66 70 90 80 90 30 20 40 66]
您可以阅读有关 indexing arrays 的官方 SciPy 文档。
文档中的示例:
>>> x = np.arange(10,1,-1)
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[np.array([3, 3, 1, 8])]
array([7, 7, 9, 2])
索引数组的值用作源数组的索引。
这也可以用 multidimensional arrays:
>>> x = array([[ 0, 1, 2],
... [ 3, 4, 5],
... [ 6, 7, 8],
... [ 9, 10, 11]])
>>> rows = np.array([[0, 0],
... [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
... [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0, 2],
[ 9, 11]])
只需使用 mapping[arr]
访问新 Numpy 数组中的正确元素:
>>> arr = np.array([0, 1, 3, 5, 5, 6, 7, 9, 8, 9, 3, 2, 4, 6])
>>> mapping = np.array([0, 10, 20, 30, 40, 55, 66, 70, 80, 90])
>>> print(mapping[arr])
array([ 0, 10, 30, 55, 55, 66, 70, 90, 80, 90, 30, 20, 40, 66])
如果你想要它作为 list
:
>>> print(list(mapping[arr]))
[0, 10, 30, 55, 55, 66, 70, 90, 80, 90, 30, 20, 40, 66]
请考虑以下代码:
arr = np.array([0, 1, 3, 5, 5, 6, 7, 9, 8, 9, 3, 2, 4, 6])
mapping = np.array([0, 10, 20, 30, 40, 55, 66, 70, 80, 90])
res = np.zeros_like(arr)
min_val = 0
max_val = 10
for val in range(min_val, max_val):
res[arr == val] = mapping[val]
print(res)
Numpy 数组 arr
可以多次出现区间 [min_val, max_val)
中的整数。 mapping
数组将具有每个整数的映射,mapping
数组的大小将为 max_val
。 res
数组是结果数组。
for
循环将 arr
中多次出现的元素替换为 mapping
中的相应值。例如,arr
中的 0
值将替换为 mapping[0]
,而 arr
中的 5
将替换为 mapping[5]
。
以上代码运行结果如下
[ 0 10 30 55 55 66 70 90 80 90 30 20 40 66]
问题:如何使用 Numpy 而不是 for
循环来执行此操作?
答案是用Numpy的fancy indexing
您可以简单地使用 arr
作为 mapping
的索引数组:
mapping[arr]
输出是
[ 0 10 30 55 55 66 70 90 80 90 30 20 40 66]
您可以阅读有关 indexing arrays 的官方 SciPy 文档。 文档中的示例:
>>> x = np.arange(10,1,-1)
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[np.array([3, 3, 1, 8])]
array([7, 7, 9, 2])
索引数组的值用作源数组的索引。
这也可以用 multidimensional arrays:
>>> x = array([[ 0, 1, 2],
... [ 3, 4, 5],
... [ 6, 7, 8],
... [ 9, 10, 11]])
>>> rows = np.array([[0, 0],
... [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
... [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0, 2],
[ 9, 11]])
只需使用 mapping[arr]
访问新 Numpy 数组中的正确元素:
>>> arr = np.array([0, 1, 3, 5, 5, 6, 7, 9, 8, 9, 3, 2, 4, 6])
>>> mapping = np.array([0, 10, 20, 30, 40, 55, 66, 70, 80, 90])
>>> print(mapping[arr])
array([ 0, 10, 30, 55, 55, 66, 70, 90, 80, 90, 30, 20, 40, 66])
如果你想要它作为 list
:
>>> print(list(mapping[arr]))
[0, 10, 30, 55, 55, 66, 70, 90, 80, 90, 30, 20, 40, 66]