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