Краткий вектор добавления в Python?

Я часто делаю векторное добавление списков Python.

Пример: у меня есть два списка:

a = [0.0, 1.0, 2.0]
b = [3.0, 4.0, 5.0]

Теперь я хочу добавить b в a, чтобы получить результат a = [3.0, 5.0, 7.0].

Обычно я заканчиваю так:

a[0] += b[0]
a[1] += b[1]
a[2] += b[2]

Есть ли эффективный стандартный способ сделать это с меньшим количеством ввода?

UPDATE: Можно предположить, что списки имеют длину 3 и содержат поплавки.

Ответ 1

Я не думаю, что вы найдете более быстрое решение, чем 3 суммы, предложенные в вопросе. Преимущества numpy видны с большими векторами, а также если вам нужны другие операторы. numpy особенно полезен с матрицами, ведь это трюк с списками python.

Тем не менее, это еще один способ сделать это: D

In [1]: a = [1,2,3]

In [2]: b = [2,3,4]

In [3]: map(sum, zip(a,b))
Out[3]: [3, 5, 7]

Изменить: вы также можете использовать izip из itertools, версию генератора zip

In [5]: from itertools import izip

In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]

Ответ 2

В то время как Numeric - отличное решение и рекомендации по составлению списка, если вы действительно хотели создать новый список, я удивлен, что никто не предложил "один очевидный способ сделать это" - простой цикл for! Лучше всего:

for i, bi in enumerate(b): a[i] += bi

Также OK, sorta sorta:

for i in xrange(len(a)): a[i] += b[i]

Ответ 3

Если вам нужна эффективная векторная арифметика, попробуйте Numpy.

>>> import numpy
>>> a=numpy.array([0,1,2])
>>> b=numpy.array([3,4,5])
>>> a+b
array([3, 5, 7])
>>> 

Или (спасибо, Andrew Jaffe),

>>> a += b
>>> a
array([3, 5, 7])
>>> 

Ответ 4

Если вы считаете, что Numpy слишком переполнен, это должно быть очень быстро, потому что этот код работает в чистом C (map() и __add__() оба непосредственно реализованы в C):

a = [1.0,2.0,3.0]
b = [4.0,5.0,6.0]

c = map(float.__add__, a, b)

Или, альтернативно, если вы не знаете типы в списке:

import operator
c = map(operator.add, a, b)

Ответ 5

Как насчет этого:

a = [x+y for x,y in zip(a,b)]

Ответ 6

Или, если вы хотите использовать внешнюю библиотеку (и массивы с фиксированной длиной), используйте numpy, который имеет "+ =" и связанные операции для операций на месте.

import numpy as np
a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
a += b

Ответ 7

[a [x] + b [x] для x в диапазоне (0, len (a))]

Ответ 8

Если вы после кратки, попробуйте...

vectors = [[0.0, 1.0, 2.0],[3.0, 4.0, 5.0]]
[sum(col) for col in zip(*vectors)]

Хотя я не могу говорить за это.

Ответ 9

В общем случае, имея список списков, вы можете сделать что-то вроде этого:

In [2]: import numpy as np

In [3]: a = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3],[4, 5, 6]])

In [4]: [sum(a[:,i]) for i in xrange(len(a[0]))]
Out[4]: [10, 11, 12]

Ответ 10

Вы можете создать функцию, которая получает размер массива, перебирает его и создает возвращаемый массив, который он возвращает.

Ответ 11

Улучшение (меньше потребления памяти) списка понятий

импортировать itertools a = [x + y для x, y в itertools.izip(a, b)]

Собственно, если вы не уверены, что a будет потребляться, я бы даже пошел с выражением генератора:

(x + y для x, y в itertools.izip(a, b))

Ответ 12

list(map(lambda x:x[0]+x[1], zip(a,b)))

Ответ 13

a = map(lambda x, y: x + y, a, b)