Python zip 和元素减法的区别

Python difference between zip and elementwise 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)]

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

第一个版本使用nested comprehension: pred中的每个元素与中的每个元素配对=11=] (length == n * m).

另一方面,

zip 进行 element-wise 配对,如 zip (length == min(n, m))。

您在两种情况下都使用 list comprehension

se = [(p-0) for p in pred for o in obs]

这里你在for循环中使用了for循环(嵌套)

但是在你的第二次尝试中,你使用了 zip(list1,list2) 从两个列表中压缩或配对 element-wise

在此处查找 zip

的文档

好吧,你可以打印出来看看效果如何:

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

并不是关于嵌套列表理解和 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