2016-05-09 2 views
4

У меня есть список векторов, список скаляров и начальная точка, представленная кортежем.Совокупная сумма векторов из точки

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.accumulate но func аргумент должен быть функцией двух аргументов. Есть идеи ?

+0

Можно ли накопить x, а затем y? Объедините x и y, чтобы стать вектором – Striker

+0

@ strike: это не было бы идеальным, так как мои точки на самом деле являются подклассом кортежа с добавленными свойствами 'point.x' и' point.y', то же самое для векторов. –

+1

Если ваши точки являются подклассом кортежа, почему ваша функция 'add_vector' не возвращает экземпляр этого класса? – holdenweb

ответ

1

Просто понял, что я мог бы создать функцию генератора вместо использования 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 
0

Как насчет добавления вспомогательной функции для 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)] 
+0

Спасибо за ваше предложение. Строка 'temp = zip ([start] + vecs, [1] + scalars]" создает два списка, которые потенциально могут быть довольно длинными (1E5). –

0

Вы можете использовать numpy для векторных вычислений. Используйте функцию numpy.dot, чтобы умножить ваши скаляры на вашу матрицу векторов. Наконец добавьте вектор начала в .dot-продукт.

Смежные вопросы