填充指定索引之间的向量值

时间:2019-09-16 23:25:59

标签: python arrays numpy numpy-ndarray

从向量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

最有效的方法是什么?

2 个答案:

答案 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)