Tengo una lista de vectores, una lista de escalares y un punto de inicio representado por una tupla.

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

Tengo una función para agregar "k veces" un vector a un punto.

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

Me gustaría obtener la lista de puntos en la polilínea de manera que:

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

Pensé en usar itertools.accumulate pero el argumento func debe ser una función de dos argumentos. Algunas ideas ?

4
Jacques Gaudin 9 may. 2016 a las 17:06

3 respuestas

La mejor respuesta

Me di cuenta de que podía crear una función generadora en lugar de usar 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
1
Jacques Gaudin 9 may. 2016 a las 14:52

¿Qué hay de agregar una función auxiliar para add_vector (func () en el siguiente código):

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)]
0
hunminpark 9 may. 2016 a las 14:43

Puede usar numpy para cálculos vectoriales. Use la función numpy.dot para multiplicar sus escalares con su matriz de vectores. Finalmente agregue el vector de inicio al producto .dot.

0
raptisth 9 may. 2016 a las 18:06