2个列表之间的乘法

时间:2015-07-23 20:00:56

标签: python python-3.x matrix-multiplication

我有2个列表

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)

3 个答案:

答案 0 :(得分:4)

你可以使用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使用转置:

>>> (a.T*b).T 
array([[ 8, 12, 20],
       [ 6, 12,  4],
       [ 1,  3,  2]])

答案 1 :(得分:4)

使用zip()组合每个list

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

答案 2 :(得分:-1)

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

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

现在替代方法我已经正确地阅读了这个问题并且意识到ab的长度相同:

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