Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一个点开始向量的累积和_Python_Python 3.x_Accumulate - Fatal编程技术网

Python 从一个点开始向量的累积和

Python 从一个点开始向量的累积和,python,python-3.x,accumulate,Python,Python 3.x,Accumulate,我有一个向量列表,一个标量列表和一个元组表示的起点 vecs = [(1,1), (2,3), (-1,1)] scalars = [2, 3, 2] start = (-5,0) 我有一个函数,可以把“k乘以”一个向量加到一个点上 def add_vector(point, k, vec): return (point[0]+k*vec[0], point[1]+k*vec[1]) 我希望获得多段线上的点列表,以便: result[0] = start result[n+1] =

我有一个向量列表,一个标量列表和一个元组表示的起点

vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)
我有一个函数,可以把“k乘以”一个向量加到一个点上

def add_vector(point, k, vec):
    return (point[0]+k*vec[0], point[1]+k*vec[1])
我希望获得多段线上的点列表,以便:

result[0] = start
result[n+1] = add_vector(result[n], scalars[n], vecs[n]) 

我曾想过使用
itertools.acculate
,但
func
参数必须是两个参数的函数。有什么想法吗?

我刚刚发现我可以创建一个生成器函数,而不是使用
itertools.acculate

def accumulate_vector(start, scalars, vecs):
    prev = start
    yield start
    for k, vec in zip(scalars, vecs):
        prev = add_vector(prev, k, vec)
        yield prev

在下面的代码中为add_vector(func())添加一个辅助函数如何:


可以使用numpy进行向量计算。
使用numpy.dot函数将标量与向量矩阵相乘。最后将起始向量添加到.dot乘积。

是否可以先累加x,然后累加y?将x和y组合成vector@strike:这不太理想,因为我的点实际上是元组的一个子类,添加了属性
point.x
point.y
,向量也是如此。如果你的点是元组的一个子类,为什么您的
add_vector
函数不返回该类的实例?@holdenweb:这一点很好。在实际代码中,它返回我的
类的一个实例。我没有在问题中说明这一点,因为我认为这会使问题变得不那么清楚。我可以从
tuple
创建
Point
的实例,也可以从
Point
的实例创建
tuple
。VEC列表已创建为
的实例。感谢您的建议。行
temp=zip([start]+vecs,[1]+scalars)
创建了两个可能相当长(1E5)的列表。
from itertools import accumulate

def add_vector(point, k, vec):
    return (point[0]+k*vec[0], point[1]+k*vec[1])

def func(data1, data2): # data : a tuple (vector, scalar)
    vec1, k1 = data1
    vec2, k2 = data2
    return (add_vector(vec1, k2, vec2), k2)

vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)

temp = zip([start]+vecs, [1]+scalars)
result = [data[0] for data in accumulate(temp, func)]

print(result) # [(-5, 0), (-3, 2), (3, 11), (1, 13)]