두 목록을 요소별로 곱하는 방법은 무엇입니까?
Matlab에서 할 수있는 것처럼 파이썬에서 두 목록을 값으로 곱하기 위해 요소 현명한 곱셈을 수행하고 싶습니다.
이것이 내가 Matlab에서하는 방법입니다.
a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]
목록 이해는 from 과 from x * y
의 모든 조합 에 대해 16 개의 목록 항목을 제공합니다 . 이것을 매핑하는 방법을 모릅니다.x
a
y
b
누군가 왜 그 이유에 관심이 있다면, 나는 데이터 세트를 가지고 있고 그것을 곱하고 싶습니다 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
'programing tip' 카테고리의 다른 글
Android에서 HTTP GET 요청에 매개 변수를 추가하는 방법은 무엇입니까? (0) | 2020.07.16 |
---|---|
클립으로 URL에서 이미지 저장 (0) | 2020.07.16 |
Django : 문자열에서 모델을 가져 오시겠습니까? (0) | 2020.07.16 |
디버깅하지 않는 경우 Android Studio에서 "디버거 대기 중"이라고 표시하는 이유는 무엇입니까? (0) | 2020.07.16 |
Android에서 EditText의 최소 및 최대 값을 정의하는 방법이 있습니까? (0) | 2020.07.16 |