簡體   English   中英

如何從單獨的列表中添加/求和值

[英]How to add/sum values from separate lists

我有一個要匯總的單位列表。

我從這個開始:

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

對於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
>>> 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回答的事情 ,當數據大小增加時,它會更快

如果只希望列表中的值之和忽略NaN值,則numpy中有一個內置函數np.nansum() ,它將忽略所有NaN值:

d4 = [3,6,np.nan,10]
print(np.nansum(d4))
Out[110]: 19.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) ])

忽略nan怎么辦:

for i,j in enumerate(d3):
    if d3[i] != np.nan and d4[i] != np.nan:
        add = [(d3[i]-d4[i])**2]

您不能使用帶空/南對象/基元的數字進行運算。 另外,您減去未加的pow值(????)。 要添加,您必須:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM