我有一个单个数字列表,我想要加在一起。
我从这开始:
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]
但是,我想要这些数字的SUM,而忽略NaN(所需的输出是36 + 9 + 4):
答案 0 :(得分:6)
对于numpy中的快速代码,您希望尽可能避免循环。转换为numpy数组(坦率地说,开始可能更好,否则每次转换都会丢失!),应用向量运算,然后使用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
答案 1 :(得分:3)
>>> 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
以下是一些测试,以显示这需要多长时间,使用list,np.array,并将动态列表转换为np.array:
>>> 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回答的问题,它的方式更快
答案 2 :(得分:1)
如果您只想要忽略NaN值的列表中的值的总和,那么在numpy中有一个名为np.nansum()
的内置函数将忽略所有NaN值:
d4 = [3,6,np.nan,10]
print(np.nansum(d4))
Out[110]: 19.0
答案 3 :(得分:0)
sum([ np.nansum([x,y]) for x,y in zip(d3, d4) ])
或者,适合您的代码而不是请求:
np.nansum([ (x-y)**2 for x,y in zip(d3, d4) ])
答案 4 :(得分:0)
如何忽略南:
for i,j in enumerate(d3):
if d3[i] != np.nan and d4[i] != np.nan:
add = [(d3[i]-d4[i])**2]
答案 5 :(得分:0)
您无法使用null / nan对象/基元操作数字。 你还减去了一个不添加的粉值(????)。 要添加,您必须:
d3 = [9,9,9,8]
d4 = [3,6,2,10]
add=None
for i,j in enumerate(d3):
add = d3[i]+d4[i]
print(add)