如何在Python中执行两个列表的元素乘法?

xxj*_*jnn 124 python list multiplying elementwise-operations

我想执行元素明智的乘法,在Python中将两个列表乘以值,就像我们可以在Matlab中一样.

这就是我在Matlab中的表现.

a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]
Run Code Online (Sandbox Code Playgroud)

对于from 和from的每个组合x * y,列表理解将给出16个列表条目.不确定如何映射这个.xayb

如果有人对此感兴趣,我有一个数据集,并希望将其乘以Numpy.linspace(1.0, 0.5, num=len(dataset)) =).

gah*_*ooa 254

使用列表理解与zip():.

[a*b for a,b in zip(lista,listb)]
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`map(lambda x,y:x*y,lista,listb)`. (17认同)
  • 另一方面,如果他们想要做除此之外的其他任何事情,OP建议使用Numpy. (9认同)

NPE*_*NPE 77

由于您已经在使用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])
Run Code Online (Sandbox Code Playgroud)


小智 26

使用np.multiply(a,b):

import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)
Run Code Online (Sandbox Code Playgroud)


小智 20

您可以尝试在循环中乘以每个元素.这样做的简写就是

ab = [a[i]*b[i] for i in range(len(a))]
Run Code Online (Sandbox Code Playgroud)

  • @CorleyBrigman我不同意; 答案之间的差别很小,"这是一种方式:<code>"和"<code>".在这种特殊情况下,除了"此代码解决您的问题"之外,几乎无法解释. (6认同)
  • @CorleyBrigman我不同意; 显示结果的示例数据实际上会更有帮助 (3认同)
  • 这就是Python新手的C,C++或Java程序员如何解决这个问题.[已接受的答案](http://stackoverflow.com/a/10271504/3657941)是惯用的Python. (2认同)

Ben*_*min 9

你可以使用乘法 lambda

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


Pet*_*řek 9

还有一个答案:

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

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

list(map(operator.mul, a, b))
Run Code Online (Sandbox Code Playgroud)

产出[10,22,36,52]


小智 8

相当直观的方式:

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
Run Code Online (Sandbox Code Playgroud)


pad*_*dyg 6

gahooa 的答案对于标题中所述的问题是正确的,但如果列表已经是 numpy 格式大于 10,那么按照建议进行简单的 numpy 乘法会更快(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
Run Code Online (Sandbox Code Playgroud)

即来自以下测试程序。

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))
Run Code Online (Sandbox Code Playgroud)


lit*_*nce 5

创建一个数组;将每个列表乘以数组;将数组转换为列表

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]
Run Code Online (Sandbox Code Playgroud)