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


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.