2个列表相乘 python python两个列表对应相乘

您所在的位置:网站首页 numpy矩阵对应元素相除 2个列表相乘 python python两个列表对应相乘

2个列表相乘 python python两个列表对应相乘

2023-06-28 09:05| 来源: 网络整理| 查看: 265

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

这就是我在Matlab中要做的。

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

对于a中x的x * y和b中y的每个组合,列表理解将给出16个列表条目。 不确定如何映射。

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

为什么现在已经有关于numpy的问题呢?

顺便说一下,这是逐元素乘法,这不是点积。

可选:map(lambda x,y:x * y,list1,list2)#derp ...

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

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

另一方面,如果他们想做一些琐碎的事,OP最好使用Numpy。

在Python 2上,izip()可能是更好的选择。

完美,可在Python3中使用

您也可以使用map(lambda x,y:x*y,lista,listb)。

如果给出而不是listb的话,答案将如何变化?给出了listb类型的元素的相当列表,我们需要操作以获得一个列表。例如[x,pi,e)与[(4,5,2),(1,2,4),(4,5,6),(1,1,2),(3,3,4)],取(x,pi,e)用(4,5,2)运算,然后(x,pi,e)用(1,2,4)运算...等等。

@gxyd您应该问一个单独的问题

只是添加了mbomb007所说的内容。要将其放入列表形式,您需要使用list(map(lambda x ,y: x * y, lista, listb))

由于您已经在使用numpy,因此将数据存储在numpy数组而不是列表中很有意义。完成此操作后,您将免费获得类似智能元素的产品:

1 2 3 4 5 6 7 8In [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])

也许不是最科学的方法,但我使用timeit将其与gahooas答案相对应。 Numpy实际上比zip方法要慢一些。

就我而言,列表包含二进制值,因此numpy解决方案比使用izip快得多。

为了其他人从谷歌搜索到达这里的利益,我在下面提供了一个时间比较。

解决方案是好的,但不是优化的。

使用np.multiply(a,b):

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

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

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

欢迎来到stackoverflow!通常不建议仅使用代码的答案-请添加一些有关如何解决发问者问题的解释。

@CorleyBrigman我不同意;答案"这里是一种执行方法:"和仅" "之间的区别很小。在这种特殊情况下,除了"此代码解决了您的问题"之外,几乎没有其他解释。

@CorleyBrigman我不同意;显示结果的示例数据实际上会更有帮助

这是一位Python新手的C,C ++或Java程序员如何解决该问题。可接受的答案是惯用的Python。

相当直观的方法:

1 2 3 4 5a = [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

还有一个答案:

-1 ...需要导入

+1 ...可读性强

1

2

3

4

5import operator

a = [1,2,3,4]

b = [10,11,12,13]

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

输出[10、22、36、52]

您可以使用lambda进行乘法

1

2

3foo=[1,2,3,4]

bar=[1,2,5,55]

l=map(lambda x,y:x*y,foo,bar)

没有任何导入的模块,很好的答案。

创建一个数组;

将每个列表乘以数组;

将数组转换为列表

1

2

3

4

5

6

7

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

对于大型列表,我们可以反复进行:

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

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

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

gahooa的答案对于标题中的问题是正确的,但是如果列表已经是numpy格式或大于十,它将更快(3个数量级)并且可读性更好,如NPE。我得到这些时间:

1

2

3

4

5

6

7

8

9

10

11

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

即来自以下测试程序。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19import 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(' ') print('{:6.4f}ms -> {}, {}, {}'.format( timeit.timeit(f, setup=i, number=1000), lines[2], lines[3], f))

map函数在这里可能非常有用。

使用map,我们可以将任何函数应用于可迭代对象的每个元素。

Python 3.x

1 2 3 4 5 6 7 8 9>>> 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] >>>

当然:

1map(f, iterable)

相当于

1[f(x) for x in iterable]

因此,我们可以通过以下方式获得解决方案:

1

2

3>>> [my_mul(x,y) for x, y in zip(a,b)]

[2, 6, 12, 20]

>>>

在Python 2.x中,map()的意思是:将函数应用于可迭代对象的每个元素并构造一个新列表。

在Python 3.x中,map构造迭代器而不是列表。

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

Python 2.7

1

2

3

4

5

6>>>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+

1

2

3

4

5

6>>> from operator import mul

>>> a = [1,2,3,4]

>>> b = [2,3,4,5]

>>> [*map(mul,a,b)]

[2, 6, 12, 20]

>>>

请注意,由于map()构造了迭代器,因此我们使用*可迭代的拆包运算符来获取列表。

解压缩方法比list构造函数快一点:

1

2

3>>> list(map(mul,a,b))

[2, 6, 12, 20]

>>>

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

1

2

3

4

5

6

7def lstsum(a, b):

c=0

pos = 0

for element in a:

c+= element*b[pos]

pos+=1

return c

要维护列表类型,并单行执行(当然,在将numpy导入为np之后):

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

要么

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

可以使用枚举。

1

2

3

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

b = [2, 3, 4, 5]

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3