168

我想执行元素乘法,在 Python 中将两个列表乘以值,就像我们可以在 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

15 回答 15

322

使用与zip(): 混合的列表理解。

[a*b for a,b in zip(lista,listb)]
于 2012-04-22T19:48:34.507 回答
97

由于您已经在使用,因此将数据存储在数组而不是列表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])
于 2012-04-22T19:47:43.690 回答
39

使用 np.multiply(a,b):

import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)
于 2016-11-14T16:55:15.740 回答
23

您可以尝试在循环中将每个元素相乘。这样做的捷径是

ab = [a[i]*b[i] for i in range(len(a))]
于 2014-03-07T05:19:03.803 回答
13

还有一个答案:

-1... 需要导入
+1... 非常易读

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

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

输出 [10, 22, 36, 52]

于 2016-11-20T21:56:53.670 回答
10

相当直观的方法:

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
于 2014-03-02T12:32:28.087 回答
10

你可以使用乘法lambda

foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)
于 2016-08-04T05:31:42.713 回答
4

对于大型列表,我们可以使用迭代方式:

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

product_iter_object.next()给出输出列表中的每个元素.

输出将是两个输入列表中较短者的长度。

于 2014-08-21T15:09:18.333 回答
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]
于 2015-12-23T15:42:54.740 回答
4

map功能在这里非常有用。使用map我们可以将任何函数应用于迭代的每个元素。

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

当然:

map(f, iterable)

相当于

[f(x) for x in iterable]

所以我们可以通过以下方式获得我们的解决方案:

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

在 Python 2.xmap()中意味着:将函数应用于可迭代的每个元素并构造一个新列表。在 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]
>>>

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

请注意,由于map()构造了一个迭代器,我们使用*可迭代解包运算符来获取一个列表。解包方法比list构造函数快一点:

>>> list(map(mul,a,b))
[2, 6, 12, 20]
>>>
于 2018-01-13T01:59:29.307 回答
3

可以使用枚举。

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

ab = [val * b[i] for i, val in enumerate(a)]
于 2016-08-04T07:19:41.557 回答
3

gahooa 的答案对于标题中的问题是正确的,但是如果列表已经是 numpy 格式大于 10,它会更快(3 个数量级)并且更具可读性,按照建议进行简单的 numpy 乘法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))
于 2016-11-08T11:09:19.687 回答
2

维护列表类型,并在一行中完成(当然,在将 numpy 导入为 np 之后):

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

或者

list(np.array(a) * np.array(b))
于 2018-05-02T19:02:10.770 回答
0

您可以将其用于相同长度的列表

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c
于 2018-10-20T18:21:16.333 回答
-1
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))
于 2020-12-24T14:05:43.367 回答