python有没有办法在一对(索引,值)列表上更新列表

时间:2017-06-15 06:10:41

标签: python numpy vector

我是python的新手,我无法有效地更新当前矢量

例如。

>>>idx_val_list = [[0, 1], [2, 3], [4, 5]]

>>>idx_list = [0, 2, 4] 
>>>val_list = [1, 3, 5]
>>>vector = [0,0,0,0,0,0,0,0]

寻找实现批量更新的有效方法,例如

>>>vector.update(indexes=idx_list, values=val_list) 
>>>vector
[1,0,3,0,5,0,0,0]

除了for循环之外,还有其他有效方法可以达到这个要求吗?

5 个答案:

答案 0 :(得分:4)

我建议使用np.put代替循环或列表理解。

试试这个;

>>> vector = np.array([0,0,0,0,0,0,0,0])
>>> idx_list = [0, 2, 4]
>>> val_list = [1, 3, 5]
>>> vector
array([0, 0, 0, 0, 0, 0, 0, 0])
>>> np.put(vector, idx_list, val_list)
>>> vector
array([1, 0, 3, 0, 5, 0, 0, 0])

答案 1 :(得分:2)

for idx,val in zip(idx_list, val_list):
  vector[idx] = val

答案 2 :(得分:2)

In [149]: idx_list = [0, 2, 4]
     ...:
     ...: val_list = [1, 3, 5]
     ...:
     ...: vector = [0,0,0,0,0,0,0,0]
     ...:

In [150]: for i,j in zip(idx_list, val_list):
     ...:     vector[i] = j
     ...:

In [151]: vector
Out[151]: [1, 0, 3, 0, 5, 0, 0, 0]

答案 3 :(得分:1)

如果您没有重复索引,@ Meemduh使用np.put

正确

您也可以v[idx_list] = val_list

如果您想累积值,也可以使用np.add.at

v = np.array(vector)

np.add.at(v, idx_list, val_list)

v
Out[]: array([1, 0, 3, 0, 5, 0, 0, 0])

如果您的初始向量非常大,您可能希望将其设为scipy.sparse.lil_matrix,因为这样可以直接将值分配到其位置,而无需在其他位置分配零。

答案 4 :(得分:0)

使用numpy

import numpy
vector=numpy.array(vector)
vector[idx_list]=val_list
print vector