두 목록을 요소별로 곱하는 방법은 무엇입니까?


137

Matlab에서 할 수있는 것처럼 파이썬에서 두 목록을 값으로 곱하기 위해 요소 현명한 곱셈을 수행하고 싶습니다.

이것이 내가 Matlab에서하는 방법입니다.

a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]

목록 이해는 from 과 from x * y의 모든 조합 에 대해 16 개의 목록 항목을 제공합니다 . 이것을 매핑하는 방법을 모릅니다.xayb

누군가 왜 그 이유에 관심이 있다면, 나는 데이터 세트를 가지고 있고 그것을 곱하고 싶습니다 Numpy.linspace(1.0, 0.5, num=len(dataset)) =).


4
이미 numpy에 대해 왜 물어 보는가?
pwuertz

2
그건 그렇고, 이것은 요소 별 곱셈입니다. 이것은 내적이 아닙니다.
pwuertz

3
대안 : map (lambda x, y : x * y, list1, list2) #derp ...
xxjjnn

답변:


284

zip(): 와 혼합 된 목록 이해를 사용하십시오 .

[a*b for a,b in zip(lista,listb)]

9
반면에, 사소한 경우를 넘어 다른 작업을 원한다면 OP는 Numpy를 사용하는 것이 좋습니다.
Henry Gomersall

1
Python 2에서는 izip ()이 더 나은 선택 일 수 있습니다.
yak

23
을 사용할 수도 있습니다 map(lambda x,y:x*y,lista,listb).
mbomb007

listb오히려 유형의 요소 목록 대신 주어진 답변이 어떻게 바뀌고 listb단일 목록을 얻으려면 조작해야합니다. 전의. [(4, 5, 2), (1, 2, 4), (4, 5, 6), (1, 1, 2), (3, 3, 4)]의 (x, pi, e), (4, 5, 2)로 조작 된 (x, pi, e) 그리고 (1, 2, 4)로 조작 된 (x, pi, e) ...
gxyd

@gxyd 별도의 질문을하셔야합니다
mbomb007

87

이미를 사용하고 있으므로 목록이 아닌 배열에 numpy데이터를 저장하는 numpy것이 좋습니다. 이 작업을 수행하면 요소 별 제품과 같은 것을 무료로 얻을 수 있습니다.

In [1]: import numpy as np

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

In [3]: b = np.array([2,3,4,5])

In [4]: a * b
Out[4]: array([ 2,  6, 12, 20])

1
아마도 가장 과학적인 것은 아니지만 timeit를 사용하여 gahooa의 답변과 비교했습니다. Numpy는 실제로 zip 방법보다 약간 느립니다.
체이스 로버츠

1
필자의 경우 목록에 이진 값이 포함되어 있으면 numpy 솔루션이 izip을 사용하는 것보다 훨씬 빠릅니다.
Serendipity

Google 검색에서 여기에 도착하는 다른 사람들의 이익을 위해 아래에 시간 비교를 포함 시켰습니다.
paddyg

31

np.multiply (a, b)를 사용하십시오.

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

21

루프에서 각 요소를 곱할 수 있습니다. 그렇게하는 짧은 손은

ab = [a[i]*b[i] for i in range(len(a))]

stackoverflow에 오신 것을 환영합니다! 코드 전용 답변은 일반적으로 사용하지 않는 것이 좋습니다. 이것이 질문자의 질문을 어떻게 해결하는지에 대한 설명을 추가하십시오.
Corley Brigman

7
@CorleyBrigman 동의하지 않습니다. "이 작업을 수행하는 방법은 다음과 같습니다 : <code>"와 "<code>"라는 답 사이에는 거의 차이가 없습니다. 이 특정 상황에서는 "이 코드로 문제를 해결합니다"이외의 설명은 거의 없습니다.
icedtrees

4
@CorleyBrigman 동의하지 않습니다. 결과를 표시하는 예제 데이터가 실제로 더 유용 할 것입니다.
Tjorriemorrie

2
이것이 파이썬 초보자 인 C, C ++ 또는 Java 프로그래머가 문제를 해결하는 방법입니다. 허용 대답은 관용적 인 파이썬입니다.
David Cullen

@Tjorriemorrie는 질문에서 명시 적으로 요청한 결과가 명확합니다. 목록 이해가 어떻게 작동하는지에 대한 설명은 좋을 수도 있고 이것이 목록 이해를 사용한다고 말하고 모든 사람들이 그것을 알지 못한다면 그것을 찾을 수 있습니다.
xuiqzy

10

또 다른 대답 :

-1... 가져 오기
+1가 필요합니다 ... 매우 읽기 쉽습니다

import operator
a = [1,2,3,4]
b = [10,11,12,13]

list(map(operator.mul, a, b))

출력 [10, 22, 36, 52]


지도를 알고 있다면 이것은 정말 읽기 쉬운 솔루션입니다! 가져 오기가 파일 맨 위에있는 것 외에 부정적인 결과가 있습니까? (원하는 경우 편집자가 가져 오기를 숨길 수 있습니다.) 내가 볼 수있는 한, 모든 Python 2 및 3 버전에서 사용할 수 있어야합니다!
xuiqzy

9

이것을하는 상당히 직관적 인 방법 :

a = [1,2,3,4]
b = [2,3,4,5]
ab = []                        #Create empty list
for i in range(0, len(a)):
     ab.append(a[i]*b[i])      #Adds each element to the list

9

당신은 곱셈을 사용할 수 있습니다 lambda

foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)

4

큰 목록의 경우 iter-way로 할 수 있습니다.

product_iter_object = itertools.imap(operator.mul, [1,2,3,4], [2,3,4,5])

product_iter_object.next() 출력 목록의 각 요소를 제공합니다.

출력은 두 입력 목록 중 더 짧은 길이입니다.


4

하나의 배열을 만듭니다. 각 목록에 배열을 곱하십시오. 배열을 목록으로 변환

import numpy as np

a = [1,2,3,4]
b = [2,3,4,5]

c = (np.ones(len(a))*a*b).tolist()

[2.0, 6.0, 12.0, 20.0]

3

gahooa의 답변은 제목에 표시된 질문에 대해 맞지만 목록이 이미 numpy 형식 이거나 10보다 큰 경우 더 많은 (3 자릿수) 더 읽기 쉽고 읽기 쉽습니다. NPE. 나는이 타이밍을 얻는다 :

0.0049ms -> N = 4, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0075ms -> N = 4, a = [i for i in range(N)], c = a * b
0.0167ms -> N = 4, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 4, a = np.arange(N), c = a * b
0.0171ms -> N = 40, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0095ms -> N = 40, a = [i for i in range(N)], c = a * b
0.1077ms -> N = 40, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 40, a = np.arange(N), c = a * b
0.1485ms -> N = 400, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0397ms -> N = 400, a = [i for i in range(N)], c = a * b
1.0348ms -> N = 400, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0020ms -> N = 400, a = np.arange(N), c = a * b

즉, 다음 테스트 프로그램에서.

import timeit

init = ['''
import numpy as np
N = {}
a = {}
b = np.linspace(0.0, 0.5, len(a))
'''.format(i, j) for i in [4, 40, 400] 
                  for j in ['[i for i in range(N)]', 'np.arange(N)']]

func = ['''c = [a*b for a,b in zip(a, b)]''',
'''c = a * b''']

for i in init:
  for f in func:
    lines = i.split('\n')
    print('{:6.4f}ms -> {}, {}, {}'.format(
           timeit.timeit(f, setup=i, number=1000), lines[2], lines[3], f))

3

열거 형을 사용할 수 있습니다.

a = [1, 2, 3, 4]
b = [2, 3, 4, 5]

ab = [val * b[i] for i, val in enumerate(a)]

3

map기능은 여기서 매우 유용 할 수 있습니다. 사용하여 map우리가 반복자의 각 요소에 어떤 기능을 적용 할 수 있습니다.

파이썬 3.x

>>> def my_mul(x,y):
...     return x*y
...
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>>
>>> list(map(my_mul,a,b))
[2, 6, 12, 20]
>>>

물론이야:

map(f, iterable)

에 해당

[f(x) for x in iterable]

따라서 다음을 통해 솔루션을 얻을 수 있습니다.

>>> [my_mul(x,y) for x, y in zip(a,b)]
[2, 6, 12, 20]
>>>

파이썬 2.x에서 map()의미 : iterable의 각 요소에 함수를 적용하고 새로운 목록을 구성하십시오. Python 3.x map에서는 목록 대신 반복자를 구성하십시오.

대신 연산자를 my_mul사용할 수 있습니다 mul

파이썬 2.7

>>>from operator import mul # import mul operator
>>>a = [1,2,3,4]
>>>b = [2,3,4,5]
>>>map(mul,a,b)
[2, 6, 12, 20]
>>>

파이썬 3.5 이상

>>> from operator import mul
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>> [*map(mul,a,b)]
[2, 6, 12, 20]
>>>

이후주의하시기 바랍니다 map()구조 반복자는 우리가 사용하는 *반복 가능한 풀기 연산자 목록을 얻을 수 있습니다. 압축 풀기 방법은 list생성자 보다 약간 빠릅니다 .

>>> list(map(mul,a,b))
[2, 6, 12, 20]
>>>

1

목록 유형을 유지하고 한 줄로 수행하십시오 (물론 numpy를 np로 가져온 후) :

list(np.array([1,2,3,4]) * np.array([2,3,4,5]))

또는

list(np.array(a) * np.array(b))

0

같은 길이의 목록에 사용할 수 있습니다

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.