如何对两个列表进行逐元素乘法运算?

191

我想要在Python中执行逐元素乘法,将两个列表按值相乘,就像我们可以在Matlab中做的那样。

这是我在Matlab中的操作方式。

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

使用列表推导式会产生16个列表项,对于从a中选出的每个x和从b中选出的每个y的组合x * y。不确定如何进行映射。

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


5
你已经了解numpy,为什么还要问这个问题? - pwuertz
4
顺便提一下,这是逐元素相乘,而不是点积。 - pwuertz
3
替代方案:map(lambda x, y: x*y, list1, list2) # 呃... - xxjjnn
这个问题已经有了答案,_列出了一个在我之后两年发布的问题_。我真傻,应该去未来看看。 - xxjjnn
15个回答

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

4

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

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

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

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


2
为了保持列表类型,并且只使用一行代码(当然,在导入numpy库之后):
list(np.array([1,2,3,4]) * np.array([2,3,4,5]))

或者

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

0
你可以用这个来处理长度相同的列表。
def lstsum(a, b):
    c = 0
    pos = 0
    for element in a:
        c += element * b[pos]
        pos += 1
    return 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))

5
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。来自审核 - double-beep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接