问题描述
实际上,我需要帮助来解决与乘以2D列表有关的问题。
问题是我有两个列表,a
和b
:
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)])
就可以得到xss
和ys
中每一对的所有乘积之和。它具有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()