来自一个点的向量的累积和
Cumulative sum of vectors from a point
我有一个向量列表、一个标量列表和一个由元组表示的起点。
vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)
我有一个函数可以将 "k times" 一个向量添加到一个点。
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.accumulate
但 func
参数必须是两个参数的函数。有什么想法吗?
刚刚发现我可以创建一个生成器函数而不是使用 itertools.accumulate
...
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() ):
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)]
您可以使用 numpy 进行矢量计算。
使用 numpy.dot 函数将标量与向量矩阵相乘。最后将起始向量添加到.dot 产品中。
我有一个向量列表、一个标量列表和一个由元组表示的起点。
vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)
我有一个函数可以将 "k times" 一个向量添加到一个点。
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.accumulate
但 func
参数必须是两个参数的函数。有什么想法吗?
刚刚发现我可以创建一个生成器函数而不是使用 itertools.accumulate
...
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() ):
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)]
您可以使用 numpy 进行矢量计算。 使用 numpy.dot 函数将标量与向量矩阵相乘。最后将起始向量添加到.dot 产品中。