我正在创建一个函数来计算两个列表(MSE wiki)之间的均方根误差(RMSE)。为此,我需要对列表进行逐元素减法。使用列表pred(预测)和obs(观察),我的第一次尝试是使用它:
se = [(p-0) for p in pred for o in obs]
但是这导致了一个长度为n * n的列表,其中n是原始列表的长度。最终,我发现了
se = [(p-o) for p, o in zip(pred, obs)]
是要走的路,但现在我很好奇为什么第一种方法不起作用。有什么想法吗?
答案 0 :(得分:2)
第一个版本使用pred
中的nested comprehension: 每个元素与obs
中的每个元素配对({{1 }})。
zip
是一个像 zip (length == n * m
)这样的元素配对。
答案 1 :(得分:2)
嗯,你可以打印并看看它是如何工作的:
a = [6,7,8,9]
b = [1,2,3,4]
print 'a = ',a
print 'b = ',b
print 'zipped = ', zip(a,b) #list(zip(a,b)) for Python3
print 'Unzipped = ', [(p,o) for p in a for o in b]
输出:
a = [6, 7, 8, 9]
b = [1, 2, 3, 4]
zipped = [(6, 1), (7, 2), (8, 3), (9, 4)]
Unzipped = [(6, 1), (6, 2), (6, 3), (6, 4), (7, 1), (7, 2), (7, 3), (7, 4), (8, 1), (8, 2), (8, 3), (8, 4), (9, 1), (9, 2), (9, 3), (9, 4)]
答案 2 :(得分:1)
关于嵌套列表理解与zip
之间差异的问题,并非真正的答案 - 其他答案中已经涵盖了这一点 - 而是使用zip
的替代方法:
您也可以使用Numpy。这样您就可以直接在列表上计算,例如:成对算术运算,矩阵操作等。这也应该更快一点。
>>> import numpy as np
>>> pred = np.array([10, 12, 13, 11, 15])
>>> obs = np.array([11, 15, 10, 10, 12])
>>> pred - obs
array([-1, -3, 3, 1, 3])
>>> (pred - obs)**2
array([1, 9, 9, 1, 9])
>>> np.mean((pred - obs)**2)**.5
2.4083189157584592
答案 3 :(得分:0)
您在两种情况下都使用list comprehension:
se = [(p-0) for p in pred for o in obs]
这里你已经用于循环内部循环(嵌套)
但是在你的第二次尝试中你使用了zip(list1,list2),它们从两个列表中逐个拉链或成对
在此处查看zip
的文档