나는 지금 가지고있어:
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])
파이썬 목록을 수신하려면 다음을 수행하십시오.
result.tolist()