如何执行两个列表的元素相乘?

我想执行一个元素智能乘法,在 Python 中用值将两个列表相乘,就像我们在 Matlab 中做的那样。

我在 Matlab 里就是这么做的。

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

一个列表内涵将给出16个列表条目,对应于 a中的 xb中的 y的每个组合。不确定如何绘制地图。

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

381297 次浏览

因为您已经在使用 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])

使用列表内涵混合 zip(): 。

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

相当直观的方式做到这一点:

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

您可以尝试将循环中的每个元素相乘

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

对于大型列表,我们可以采用 ITER 方法:

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

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

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

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

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]

可以使用 lambda进行乘法运算

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

可以使用枚举。

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


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

对于标题中提到的问题,gahooa 的回答是正确的,但是如果列表已经是大于十的数字格式,那么按照 NPE 的建议进行简单的数字乘法会更快(3数量级) ,也更易读。我知道这些时间:

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

使用 np.multi(a,b) :

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

还有一个答案:

-1... 需要进口
+1... 非常易读

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


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

产出[10,22,36,52]

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.x 中,map()的意思是: 将一个函数应用于迭代的每个元素并构造一个新列表。 在 Python 3.x 中,map构造迭代器而不是列表。

我们可以使用 mul运算符代替 my_mul

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

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

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

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

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

或者

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

您可以对相同长度的列表使用它

def lstsum(a, b):
c=0
pos = 0
for element in a:
c+= element*b[pos]
pos+=1
return c
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))