二维列表相乘的问题

问题描述

实际上,我需要帮助来解决与乘以2D列表有关的问题。 问题是我有两个列表,ab

a = [[-0.104],[-0.047],[-0.046]]
b = [[0.183,0.366,0.456],[0.971,0.156,0.856]]

我想将a中的每个元素与b第一子列表中的相应元素相乘,以便:

(-0.104 * 0.183) + (-0.047 * 0.366) + (-0.046 * 0.456)

然后,我再次将a中的每个元素与b second 子列表中的对应元素相乘,如下:

(-0.104 * 0.971) + (-0.047 * 0.156) + (-0.046 * 0.856)

结果应为2个元素。 因此,我已经使用Python实现了自己的代码,但不幸的是,该代码无法正常工作。

因此,我需要一些帮助来修复代码中的错误

代码如下:

a= [[-0.104],[-0.046]]

b= [[0.183,0.856]]

sumR=0
res2=[]

for i in range(0,len(a)):
    for j in range(0,len(b[0])):
        for k in range(j):
            r= (a[i][j]*b[k][j])
            sumR=sumR+r
    res2.append(round(sumR,6))
print(res2)

解决方法

您的问题对于使用其他语言的Python程序员来说很常见。

尝试使用Python的优势,而不是用Python编写C / Java /任何东西:

xss = [[-0.104],[-0.047],[-0.046]]
yss = [[0.183,0.366,0.456],[0.971,0.156,0.856]]

answers = [sum([xs[0] * y for xs,y in zip(xss,ys)]) for ys in yss]
print(answers)

(或者,如果您不反对使用Python的更多优势,即其许多出色的第三方库,请使用numpy之类的东西,例如@GilPinsky建议)

对列表理解的一些解释:类似[ys for ys in yss]的内容会导致Python遍历yss,将yss的每个值依次分配给ys,进行收集结果在列表中。您当然可以对ys进行操作以使其有用。

zip(xss,ys)xss的每个元素与ys中的元素配对并返回一个可迭代的元素。 [xs,y for in zip(xss,ys)]将为您提供该组合中所有元组的列表。这样sum([xs[0] * y for xs,ys)])就可以得到xssys中每一对的所有乘积之和。它具有xs[0],因为来自xss的元素本身就是列表,而您只对每个元素的第一个元素感兴趣。

我对变量进行了重命名,以使其更容易跟踪内容。 x只是某个值,xs是多个值的列表,xss是此类列表的列表,依此类推-与y和{{1 }}。

,

不确定这是否是您要寻找的答案:[-0.05721,-0.147692]


    a= [[-0.104],[-0.046]]
    
    b= [[0.183,0.856]]
    
    sumR=0
    res2=[]
    for i in range(0,len(b)):
        sumR = 0
        for j in range(0,len(a)):
          # every list in a as only 1 element
          r= (a[j][0]*b[i][j])
    
          # print(a[j][0],b[i][j],end = " + ")
          sumR=sumR+r
         #print()
        res2.append(round(sumR,6))
    print(res2)

取消注释打印语句以查看计算过程

,

更好的解决方案是在这种情况下不使用循环。 请注意,您要实现的是将矩阵乘以向量,因此可以使用numpy高效地执行此操作,如下所示:

import numpy as np

a = np.array([[-0.104],[-0.046]])
b = np.array([[0.183,0.856]])
res2 = (b @ a).tolist()