Python 在numpy数组中的某个范围添加一些值?

Python 在numpy数组中的某个范围添加一些值?,python,arrays,Python,Arrays,我有一个numpy数组,看起来像这样 [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 现在我有一个2d数组,它告诉开始索引和结束索引以及要求和的值。像这样 [[5,12,29] [8,22719]] 我想更快地将这些数字添加到初始数组中 目前我的解决方案是 f= np.zeros(n+1, dtype = int) # print(rounds) for elem in rounds: print('rounds : ',elem) one

我有一个numpy数组,看起来像这样

[1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]

现在我有一个2d数组,它告诉开始索引和结束索引以及要求和的值。像这样

[[5,12,29] [8,22719]]

我想更快地将这些数字添加到初始数组中

目前我的解决方案是

f= np.zeros(n+1, dtype = int)

# print(rounds)
for elem in rounds:
    print('rounds : ',elem)
    one = elem[0]
    two = elem[1]
    value_add = elem[2]
# for i in range(0,n+1):
    for i in range(one-1,two):
        f[i-1] += value_add
        # print(f)
当矩阵变得太长时,它的速度非常慢,还有其他的优化方法吗

第二次迭代尝试优化

将numpy作为np导入

f= np.zeros(n+1, dtype = int)

# print(rounds)
new = np.zeros(n+1)
for elem in rounds:
    # prin  t('rounds : ',elem)
    one = elem[0]
    two = elem[1]
    value_add = elem[2]
# for i in range(0,n+1):

    new[one-1:two] += value_add
这个怎么样

a = np.array([1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2])
instr_array = np.array([[5, 12, 29], [8, 22, 719]])

for start, end, incr in instr_array:
    a[start:end] += incr

您可以创建遮罩并使用间接寻址让numpy完成所有工作(即不使用任何循环):

valueMask
变量是
a
中位置的真/假矩阵,其中将分配
iv
的每个值

valueIndex
变量将掩码转换为1D数组,指示将在每个位置最后分配
iv
值(索引)中的哪一个。对于未更改的位置,它将包含-1

targetMask
变量选择实际将接收新值的
a
的位置,并排除不会更改的位置。它会导致在值赋值的间接寻址中使用位置的真/假掩码

最后一步是使用将要分配的最后一个值(
iv
)将
targetMask
定义的
a
中的元素子集分配给相应的
iv
)值


我希望这将为您提供所需的性能。我测量了将300个范围分配给2000个项目的数组,在笔记本电脑上得到了0.0028秒的时间。

我不完全清楚“求和”部分。我假设原始数组的元素必须增加一定量,从第一个索引开始,在第二个索引之前结束,这对吗?也就是说,像
[2,5,3]
这样的条目会导致原始的更改为
[1,2,5,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2]
?是的,这是正确的是的,我仍然会得到14个测试用例中的8个的时间惩罚。如果我可以问一下的话,这些测试在哪里托管?在hackerrank平台上。
import numpy as np
a   = np.array([1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2])
iv  = np.array([[5, 12, 29], [8, 22, 719]])

valueMask     = (np.arange(a.size)>=iv[:,0:1]) & (np.arange(a.size)<iv[:,1:2])
valueIndex    = np.max((np.arange(iv.shape[0])+1)[:,None]*valueMask,axis=0)-1
targetMask    = valueIndex>=0
a[targetMask] = iv[valueIndex[targetMask],2]
print(a)

[  1   2   2   2   2  29  29  29 719 719 719 719 719 719 719 719 719 719  719]