[python] 2 개의 목록을 요소별로 추가 하시겠습니까?

나는 지금 가지고있어:

list1 = [1, 2, 3]
list2 = [4, 5, 6]

나는 갖고 싶다 :

[1, 2, 3]
 +  +  +
[4, 5, 6]
|| || ||
[5, 7, 9]

단순히 두 가지 목록을 요소별로 추가 한 것입니다.

확실히 두 목록을 반복 할 수는 있지만 그렇게하고 싶지 않습니다.

가장 파이썬적인 방법 은 무엇입니까 ?



답변

map함께 사용 operator.add:

>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]

또는 zip목록 이해력 :

>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]

타이밍 비교 :

>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop


답변

다른 사람들은 순수한 파이썬에서 이것을 수행하는 방법을 예를 들었습니다. 100.000 요소가있는 배열 로이 작업을 수행하려면 numpy를 사용해야합니다.

In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])

요소 별 덧셈을하는 것이 이제는 사소한 것입니다

In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]

Matlab 에서처럼.

Ashwini의 가장 빠른 버전과 비교할 타이밍 :

In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop

In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop

따라서 이것은 25 배 더 빠릅니다! 그러나 상황에 맞는 것을 사용하십시오. 간단한 프로그램의 경우 아마도 numpy를 설치하고 싶지 않을 것이므로 표준 파이썬을 사용하십시오 ( Henry의 버전 이 가장 Pythonic 버전 임을 알았습니다 ). 심각한 수의 크 런칭 numpy이 발생하면 무거운 물건을 들어 올리십시오. 속도 괴물의 경우 : numpy 솔루션이 더 빨리 시작하는 것 같습니다 n = 8.


답변

[a + b for a, b in zip(list1, list2)]


답변

다른 사람들이 설명했듯이 빠르고 공간 효율적인 솔루션은 내장 벡터 조작 기능과 함께 numpy (np)를 사용합니다.

1. Numpy와 함께

x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y

2. 내장

2.1 람다

list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)

map ()은 여러 인수를 지원합니다.

2.2 우편 및 목록 이해

list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]


답변

numpy내 의견 으로는 사용하는 것이 더 간단합니다 .

import numpy as np
list1=[1,2,3]
list2=[4,5,6]
np.add(list1,list2)

결과 :

터미널 실행

자세한 매개 변수 정보는 여기를 확인하십시오 : numpy.add


답변

아마도 “가장 파이썬적인 방법”은 list1과 list2가 같은 크기가 아닌 경우를 처리하는 것을 포함해야합니다. 이러한 방법 중 일부를 적용하면 조용히 답변을 얻을 수 있습니다. numpy 접근 방식은 ValueError와 함께 알려줍니다.

예:

import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)

이것이 문제의 원인이라면 어떤 결과를 원하십니까?


답변

이것은 간단합니다 numpy.add()

import numpy

list1 = numpy.array([1, 2, 3])
list2 = numpy.array([4, 5, 6])
result = numpy.add(list1, list2) # result receive element-wise addition of list1 and list2
print(result)
array([5, 7, 9])

여기 doc 참조

파이썬 목록을 수신하려면 다음을 수행하십시오.

result.tolist()