从向量a
和索引列表ind
开始,我想将a
中与索引相对应的ind
的元素设置为原始函数向量(在该示例中,我将原始值加10),并希望将与ind
中每个索引对应的所有后续元素的计算值保留到下一个索引。
例如,给定:
a = [10, 11, 12, 13, 14, 15]
ind = [0, 2, 4]
返回:
result = [20, 20, 22, 22, 24, 24]
您会注意到a
中与索引ind
不对应的元素是完全不相关的。另外,如果第一个元素的索引不在ind
中,则第一个元素存在不确定性,因此我希望能够为0
不在{{1 }},则完整的测试用例集为:
ind
我可以轻松地通过循环来完成此操作,但是如果向量#test
a = np.array([10, 11, 12, 13, 14, 15])
fill(a, [2, 4], -50)
#[-50, -50, 22, 22, 24, 24]
fill(a, [0, 2, 4], -50)
#[20, 20, 22, 22, 24, 24]
fill(a, [0, 2, 4, 5], -50)
#[20, 20, 22, 22, 24, 25]
很大,则会变慢:
a
最有效的方法是什么?
答案 0 :(得分:2)
这是在索引上使用diff
来获取块大小,然后在值上使用repeat
来创建块的方法。
def fill(a,ind,f=lambda x:x+10,default=-50):
sizes = np.diff(ind,prepend=0,append=len(a))
values = np.concatenate([[default],f(a[ind])])
return values.repeat(sizes)
答案 1 :(得分:0)
我接受了保罗·潘泽(Paul Panzer)的回答,这很聪明,而且运作神奇。 但是,出于完整性考虑,我也想添加自己的答案。
此解决方案更为灵活,因为它允许由先前的元素确定结果矢量的值,但是由于嵌套的if
,我不喜欢它。
我无法找到可以消除嵌套循环的索引,并且如果但从大量测试中来看,这两种解决方案在执行时间方面是等效的(我的第一个示例慢了大约1000倍):
def fill(a,ind,startval):
res=np.zeros(len(a))
for i,it in enumerate(ind):
if i == 0:
if it == 0:
res[0]=a[0]+10
else:
res[0:it]=startval
else:
res[ind[i-1]:it]=res[ind[i-1]]
res[it]=a[it]+10
res[ind[-1]:]=res[ind[-1]]
print (res)