zip和elementwise减法之间的Python区别

时间:2017-02-06 10:38:56

标签: python list subtraction

我正在创建一个函数来计算两个列表(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)]

是要走的路,但现在我很好奇为什么第一种方法不起作用。有什么想法吗?

4 个答案:

答案 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

的文档