Python 两个列表之间的乘法

Python 两个列表之间的乘法,python,python-3.x,matrix-multiplication,Python,Python 3.x,Matrix Multiplication,我有两张单子 a=[[2,3,5],[3,6,2],[1,3,2]] b=[4,2,1] 我希望输出为: c=[[8,12,20],[6,12,4],[1,3,2]] 目前我正在使用下面的代码,但它的问题是计算时间非常长,因为我的列表中的值非常多。第一个列表有1000个列表,其中每个列表有10000个值,第二个列表有1000个值。因此计算时间是一个问题。我想要一个新的想法,在其中计算时间目前的代码是: a=[[2,3,5],[3,6,2],[1,3,2]] b=[4,2,1] c=[] s=

我有两张单子

a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
我希望输出为:

c=[[8,12,20],[6,12,4],[1,3,2]]
目前我正在使用下面的代码,但它的问题是计算时间非常长,因为我的列表中的值非常多。第一个列表有1000个列表,其中每个列表有10000个值,第二个列表有1000个值。因此计算时间是一个问题。我想要一个新的想法,在其中计算时间目前的代码是:

a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
c=[]
s=0
for i in b:
    c1=[]
    t=0
    s=s+1
    for j in a:
        t=t+1
        for k in j:
            if t==s:
                m=i*k
                c1.append(m)
    c.append(c1)
print(c)
您可以使用numpy:

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

>>> a*np.vstack(b)
array([[ 8, 12, 20],
       [ 6, 12,  4],
       [ 1,  3,  2]])
或者,正如@csunday95所建议的,作为一种更优化的方式,您可以使用转置而不是vstack:


这可能不会更快,但这是一种更整洁的方式:

c = []
b_len = len(b)
for i in range(len(a)):
    b_multiplier = b[i%b_len]
    c.append([x*b_multiplier for x in a[i]])
现在我已经正确地阅读了问题,并意识到a和b的长度相同:

c = [[x*b[i] for x in a[i]] for i in range(len(a))]  
使用zip组合每个列表:


如果可能的话,请等待Python 3.5,我建议您避免使用rangelen。。。还有硬编码的魔法数字3。幸运的是,i%3是不必要的,您可以用i替换它。在附加到c之前,您还需要在某个地方初始化c。我假设前3行仍然存在,但是rangelen和“硬编码的幻数”有什么问题?我只是好奇,因为我以前没有听说过,而且我是在Python2.7中做的,所以对我来说我不会工作:rangelen。。。通常是更传统的语言的产物,没有一种简单的方法来迭代序列的项,因此需要执行类似于int n=0的操作;n++;nMagic数字是特定的值,以后可能需要更改,也可能不需要更改,但更改起来并不容易。例如,代码中的3,或者在税务计算器的公式中包含销售税率的实际数字,而不是让公式访问变量。硬编码一个值使得代码通常更难维护。当i保证小于3时,i%3没有额外的效果。实际上没有必要这么做。您的Python版本对此没有影响。如果您必须使用Python进行如此昂贵的计算,请务必使用numpy。现在计算大约需要5-6秒,之前需要将近10分钟。谢谢你,如果你想让你的代码更花哨,你可以做a.T*b.Twell@Kasramvd两种方法都做了一次,100×100的数组乘以100长度的数组,a.T*b.T平均耗时0.045秒,而答案中的方法耗时0.63849秒seconds@csunday95是的,你是对的,更改DIM不会提高性能,但正如TigerhawkT3所说,列表理解在这里表现得更好,我认为原因是列表理解在C语言中表现得和numpy一样,但numpy中的转置和Operation*实际上应用了一些循环,这使得执行时间更长!这是迄今为止提到的最快的。你为我节省了很多时间。计算时间从10分钟减少到3-4秒。非常感谢。
c = [[x*b[i] for x in a[i]] for i in range(len(a))]  
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]

[[m*n for n in second] for m, second in zip(b,a)]