繁体   English   中英

用相应的值替换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的花式索引

您可以简单地将arr用作mapping的索引数组:

mapping[arr]

输出是

[ 0 10 30 55 55 66 70 90 80 90 30 20 40 66]

您可以阅读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])

索引数组的值用作源数组的索引。

对于多维数组,这也是可能的:


>>> 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM