首页 > 解决方案 > 如何通过索引数组替换 NumPy 数组的某些元素

问题描述

我有一个 numpy 数组a,我想替换一些元素。我有一个元组/numpy 数组中新元素的值,a并且需要在另一个元组/numpy 数组中替换该元素的索引。下面是一个使用 python 做我想做的事的例子。如何在 NumPy 中有效地做到这一点?

示例脚本:

a = np.arange(10)
print( f'a = {a}' )
newvalues = (10, 20, 35)
indexes = (2, 4, 6)
for n,i in enumerate( indexes ):
    a[i]=newvalues[n]
print( f'a = {a}' )

输出:

a =  array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a =  array([ 0,  1, 10,  3, 20,  5, 35,  7,  8,  9])

我试过a[indexes]=newvalues但得到了IndexError: too many indices for array: array is 1-dimensional, but 3 were indexed

标签: pythonnumpy

解决方案


指示要替换的元素的索引列表应该是 Python list(或类似类型),而不是tuple. 选择元组中的不同项表示它们应该从不同的轴维度中选择。

因此,a[(2, 4, 6)]与 相同a[2, 4, 6],它被解释为第一维索引 2、第二维索引 4 和第三维索引 6 处的值。

以下代码正常工作:

indexes = [2, 4, 6]
a[indexes] = newvalues

另请参阅numpy 文档中的 Indexing 页面,特别是介绍中的第二个“Note”块以及Advanced Indexing下的第一个“Warning” :

在 Python 中,x[(exp1, exp2, ..., expN)]等价于x[exp1, exp2, ..., expN]; 后者只是前者的语法糖。

高级索引的定义意味着它x[(1,2,3),]x[(1,2,3)]. 后者相当于x[1,2,3]哪个将触发基本选择,而前者将触发高级索引。请务必了解为什么会发生这种情况。


推荐阅读