How to perform element-wise multiplication of two lists? [duplicate]
Asked Answered
E

15

195

I want to perform an element wise multiplication, to multiply two lists together by value in Python, like we can do it in Matlab.

This is how I would do it in Matlab.

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

A list comprehension would give 16 list entries, for every combination x * y of x from a and y from b. Unsure of how to map this.

If anyone is interested why, I have a dataset, and want to multiply it by Numpy.linspace(1.0, 0.5, num=len(dataset)) =).

Exhilarant answered 22/4, 2012 at 19:45 Comment(3)
Why are you asking this when you already now about numpy?Kletter
And by the way, this is element-wise multiplication, this is not a dot product.Kletter
Alternative: map(lambda x, y: x*y, list1, list2) #derp...Exhilarant
O
362

Use a list comprehension mixed with zip():.

[a*b for a,b in zip(lista,listb)]
Odisodium answered 22/4, 2012 at 19:48 Comment(5)
On the other hand, if they want to do anything else beyond the trivial case here the OP would be well advised to use Numpy.Spell
On Python 2 izip() could be a better choice.Writing
You can also use map(lambda x,y:x*y,lista,listb).Reprehension
Just to add to what 'mbomb007' stated. To get this into a list form, you would need to use list(map(lambda x ,y: x * y, lista, listb))Zorn
Using pure python: Instead of using lambda, use the builtins: itertools.starmap(operator.mul, zip(a, b))Apocynthion
W
107

Since you're already using numpy, it makes sense to store your data in a numpy array rather than a list. Once you do this, you get things like element-wise products for free:

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])
Waver answered 22/4, 2012 at 19:47 Comment(2)
Maybe not the most scientific, but I timed this against gahooa's answer using timeit. Numpy is actually slightly slower than the zip method.Detonation
In my case, where the lists contained binary values, the numpy solution was much faster than using the izip.Cockchafer
T
42

Use np.multiply(a,b):

import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)
Topliffe answered 14/11, 2016 at 16:55 Comment(1)
The result is then an np.array [2 6 12 20], not a Python list [2, 6, 12, 20]. But you can write np.multiply(a,b).tolist() if you need a Python list.Maighdiln
D
23

You can try multiplying each element in a loop. The short hand for doing that is

ab = [a[i]*b[i] for i in range(len(a))]
Diapause answered 7/3, 2014 at 5:19 Comment(1)
welcome to stackoverflow! code-only answers are generally discouraged - please add some explanation as to how this solves the questioner's question.Misdate
G
15

Yet another answer:

-1 ... requires import
+1 ... is very readable

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

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

outputs [10, 22, 36, 52]

Edit

For Python3.6+ map does not automatically unpack values.

Use itertools.starmap

import itertools
import operator

itertools.starmap(operator.mul, zip(a, b)))
Gynaeceum answered 20/11, 2016 at 21:56 Comment(0)
S
12

you can multiplication using lambda

foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)
Spurlock answered 4/8, 2016 at 5:31 Comment(1)
list(map(lambda x,y:x*y,foo,bar)) in Python 3Autoeroticism
T
10

Fairly intuitive way of doing this:

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
Tenace answered 2/3, 2014 at 12:32 Comment(0)
T
6

gahooa's answer is correct for the question as phrased in the heading, but if the lists are already numpy format or larger than ten it will be MUCH faster (3 orders of magnitude) as well as more readable, to do simple numpy multiplication as suggested by NPE. I get these timings:

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

i.e. from the following test program.

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))
Tepper answered 8/11, 2016 at 11:9 Comment(0)
L
4

For large lists, we can do it the iter-way:

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

product_iter_object.next() gives each of the element in the output list.

The output would be the length of the shorter of the two input lists.

Lach answered 21/8, 2014 at 15:9 Comment(0)
H
4

create an array of ones; multiply each list times the array; convert array to a list

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]
Hattiehatton answered 23/12, 2015 at 15:42 Comment(0)
D
4

Can use enumerate.

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

ab = [val * b[i] for i, val in enumerate(a)]
Decorous answered 4/8, 2016 at 7:19 Comment(0)
L
4

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]
>>>
Labyrinth answered 13/1, 2018 at 1:59 Comment(0)
I
2

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))
Indre answered 2/5, 2018 at 19:2 Comment(0)
D
0

You can use this for lists of same length:

def lstsum(a, b):
    c = 0
    pos = 0
    for element in a:
        c += element * b[pos]
        pos += 1
    return c
Dennet answered 20/10, 2018 at 18:21 Comment(0)
C
0
import ast,sys

input_str = sys.stdin.read()
input_list = ast.literal_eval(input_str)

list_1 = input_list[0]
list_2 = input_list[1]

import numpy as np

array_1 = np.array(list_1)
array_2 = np.array(list_2)
array_3 = array_1*array_2

print(list(array_3))
Clump answered 24/12, 2020 at 14:5 Comment(1)
While this code may solve the question, including an explanation of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply. From ReviewTaluk

© 2022 - 2024 — McMap. All rights reserved.