2024-09-27 04:25:33 发布
网友
我有一个我想加在一起的个位数的列表。你知道吗
我从这个开始:
d3 = [9,9,9,8] d4 = [3,6,np.nan,10] for i,j in enumerate(d3): add = [(d3[i]-d4[i])**2]
当我执行上述代码时,我得到以下列表:
[36] [9] [nan] [4]
但是,我需要这些数字的总和,同时忽略NaN(期望的输出是36+9+4):
>>> import numpy as np >>> d3 = [9,9,9,8] >>> d4 = [3,6,np.nan,10] >>> total = np.nansum([(a-b)**2 for a,b in zip(d3, d4)]) 49.0
下面是一些测试,用列表显示这需要多长时间,np.数组,并将列表转换为np.数组正在运行:
>>> import numpy as np >>> short_l1 = [9,9,9,8] >>> short_l2 = [3,6,np.nan,10] >>> long_l1 = short_l1 * 1000 >>> long_l2 = short_l2 * 1000 >>> short_a1 = np.array(short_l1) >>> short_a2 = np.array(short_l2) >>> long_a1 = np.array(long_l1) >>> long_a2 = np.array(long_l2) >>> %timeit np.nansum([(a-b)**2 for a,b in zip(short_l1 , short_l2)]) 9.1 µs ± 29.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) >>> %timeit np.nansum((np.array(short_l1)-np.array(short_l2))**2) 12 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) >>> %timeit np.nansum((short_a1-short_a2)**2) 9.07 µs ± 24.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) >>> %timeit np.nansum([(a-b)**2 for a,b in zip(long_l1 , long_l2)]) 1.32 ms ± 15.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>> %timeit np.nansum((np.array(long_l1)-np.array(long_l2))**2) 498 µs ± 3.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>> %timeit np.nansum((long_a1-long_a2)**2) 48.7 µs ± 581 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
正如您所看到的,您肯定应该按照@DSM的回答来做,当您的数据量增加时,会更快
对于numpy中的快速代码,您希望尽可能避免循环。转换为numpy数组(坦率地说,最好从开始,否则每次转换都会失败!),应用向量运算,然后使用np.nansum:
np.nansum
In [9]: np.array(d3) - np.array(d4) Out[9]: array([ 6., 3., nan, -2.]) In [10]: (np.array(d3) - np.array(d4))**2 Out[10]: array([ 36., 9., nan, 4.]) In [11]: np.nansum((np.array(d3) - np.array(d4))**2) Out[11]: 49.0
作为比较,如果我们从numpy数组开始,读起来更好:
In [14]: d3 = np.array(d3); d4 = np.array(d4) In [15]: np.nansum((d3-d4)**2) Out[15]: 49.0
如果您只希望列表中的值之和忽略NaN值,numpy中有一个名为np.nansum()的内置函数将忽略所有NaN值:
np.nansum()
d4 = [3,6,np.nan,10] print(np.nansum(d4)) Out[110]: 19.0
编辑
下面是一些测试,用列表显示这需要多长时间,np.数组,并将列表转换为np.数组正在运行:
正如您所看到的,您肯定应该按照@DSM的回答来做,当您的数据量增加时,会更快
对于numpy中的快速代码,您希望尽可能避免循环。转换为numpy数组(坦率地说,最好从开始,否则每次转换都会失败!),应用向量运算,然后使用
np.nansum
:作为比较,如果我们从numpy数组开始,读起来更好:
如果您只希望列表中的值之和忽略NaN值,numpy中有一个名为
np.nansum()
的内置函数将忽略所有NaN值:相关问题 更多 >
编程相关推荐