programing tip

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

itbloger 2020. 7. 16. 19:45
반응형

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


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)) =).


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

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

이미를 사용하고 있으므로 목록이 아닌 배열에 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])

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

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

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

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

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

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

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

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

또 다른 대답 :

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

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

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

출력 [10, 22, 36, 52]


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

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]

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

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

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

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


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))

The map function can be very useful here. Using map we can apply any function to each element of an iterable.

Python 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]
>>>

Of course:

map(f, iterable)

is equivalent to

[f(x) for x in iterable]

So we can get our solution via:

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

In Python 2.x map() means: apply a function to each element of an iterable and construct a new list. In Python 3.x, map construct iterators instead of lists.

Instead of my_mul we could use mul operator

Python 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]
>>>

Python 3.5+

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

Please note that since map() constructs an iterator we use * iterable unpacking operator to get a list. The unpacking approach is a bit faster then the list constructor:

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

Can use enumerate.

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

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

To maintain the list type, and do it in one line (after importing numpy as np, of course):

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

or

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

you can use this for lists of the same length

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c

참고URL : https://stackoverflow.com/questions/10271484/how-to-perform-element-wise-multiplication-of-two-lists

반응형