我想执行元素明智的乘法,在Python中将两个列表乘以值,就像我们可以在Matlab中一样。
这就是我在Matlab中的表现。
a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]
对于来自x * y
的{{1}}和来自x
的{{1}}的{{1}}的每个组合,列表理解将提供16个列表条目。不确定如何映射。
如果有人对此感兴趣,我有一个数据集,并希望将其乘以a
。
答案 0 :(得分:228)
使用与zip()
混合的列表理解:。
[a*b for a,b in zip(lista,listb)]
答案 1 :(得分:75)
由于您已经在使用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])
答案 2 :(得分:23)
使用np.multiply(a,b):
import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)
答案 3 :(得分:18)
您可以尝试在循环中乘以每个元素。这样做的简写是
ab = [a[i]*b[i] for i in range(len(a))]
答案 4 :(得分:7)
相当直观的方式:
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
答案 5 :(得分:6)
您可以使用lambda
foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)
答案 6 :(得分:6)
又一个答案:
-1
...需要导入
+1
...非常易读
import operator
a = [1,2,3,4]
b = [10,11,12,13]
list(map(operator.mul, a, b))
输出[10,22,36,52]
答案 7 :(得分: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]
答案 8 :(得分:3)
对于大型列表,我们可以通过以下方式实现:
product_iter_object = itertools.imap(operator.mul, [1,2,3,4], [2,3,4,5])
product_iter_object.next()
给出输出列表中的每个元素。
输出将是两个输入列表中较短者的长度。
答案 9 :(得分:2)
gahooa的答案对于标题中的措辞是正确的,但如果列表已经是大于10的numpy格式 或 ,那么它将更快(3个订单)如NPE所建议的那样,进行简单的numpy乘法,并且更具可读性。我得到了这些时间:
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))
答案 10 :(得分:1)
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()
表示:将函数应用于iterable的每个元素并构造一个新列表。
在Python 3.x中,map
构造迭代器而不是列表。
我们可以使用my_mul
运算符
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()
构造了一个迭代器,我们使用*
iterable unpacking运算符来获取列表。
解包方法比list
构造函数快一点:
>>> list(map(mul,a,b))
[2, 6, 12, 20]
>>>
答案 11 :(得分:0)
可以使用枚举。
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
ab = [val * b[i] for i, val in enumerate(a)]
答案 12 :(得分:0)
要维护列表类型,并在一行中执行(当然,在将numpy导入为np之后):
list(np.array([1,2,3,4]) * np.array([2,3,4,5]))
或
list(np.array(a) * np.array(b))
答案 13 :(得分:0)
您可以将其用于相同长度的列表
def lstsum(a, b):
c=0
pos = 0
for element in a:
c+= element*b[pos]
pos+=1
return c
答案 14 :(得分:-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))