Chciałbym dodać tysiące 4D macierzy elementów mądrych i księgowości dla nie. Prosty przykład przy użyciu tablic 1D byłby:

X = array([4,7,89,nan,89,65, nan])
Y = array([0,5,4, 9,  8, 100,nan])
z = X+Y
print z = array([4,12,93,9,97,165,nan])

Napisałem proste dla pętli wokół tego, ale trwa wiecznie - nie jest inteligentnym rozwiązaniem. Innym rozwiązaniem może być tworzenie większej tablicy i używać wąskich Nansum, ale zajmie to zbyt wiele pamięci dla mojego laptopa. Potrzebuję sumy biegowej ponad 11000 przypadków.

Czy ktoś ma inteligentny i szybki sposób, aby to zrobić?

8
Shejo284 23 sierpień 2012, 21:01

4 odpowiedzi

Najlepsza odpowiedź

Oto jedna możliwość:

>>> x = np.array([1, 2, np.nan, 3, np.nan, 4])
... y = np.array([1, np.nan, 2, 5, np.nan, 8])
>>> x = np.ma.masked_array(np.nan_to_num(x), mask=np.isnan(x) & np.isnan(y))
>>> y = np.ma.masked_array(np.nan_to_num(y), mask=x.mask)
>>> (x+y).filled(np.nan)
array([  2.,   2.,   2.,   8.,  nan,  12.])

Prawdziwą trudnością jest to, że wydaje się, że chcesz interpretować nan, aby być interpretowany jako zero, chyba że wszystkie wartości w określonej pozycji są nan. Oznacza to, że musisz spojrzeć na zarówno X, jak i Y, aby określić, który nie zastąpi. Jeśli masz w porządku, mając wszystkie wartości Nan, możesz po prostu zrobić np.nan_to_num(x) + np.nan_to_num(y).

10
BrenBarn 23 sierpień 2012, 17:20

Możesz zrobić coś takiego:

arr1 = np.array([1.0, 1.0, np.nan, 1.0, 1.0, np.nan])
arr2 = np.array([1.0, 1.0, 1.0, 1.0, 1.0, np.nan])
flags = np.isnan(arr1) & np.isnan(arr2)
copy1 = arr1.copy()
copy2 = arr2.copy()
copy1[np.isnan(copy1)] = 0.0
copy2[np.isnan(copy2)] = 0.0
out = copy1 + copy2
out[flags] = np.NaN
print out
array([  2.,   2.,   1.,   2.,   2.,  NaN])

Aby znaleźć lokalizacje w tabliczkach, w których oba mają NaN w tym indeksie. Następnie zrób zasadniczo, co zasugerował @mgilson, jak w tworzeniu kopii i zastąp NaN s z 0,0, dodaj dwie tablice razem, a następnie zastąpić oznaczone np.NaN.

3
Andy Hayden 30 grudzień 2012, 18:26
import numpy as np
z=np.nansum([X,Y],axis=0)
3
Radim Köhler 24 wrzesień 2013, 12:50

Nie jesteś pewien, jak to miałoby działać, ale warto strzał :)

def nan_to_zero(array):
    new_arr = array.copy()
    new_arr[np.isnan(array)] = 0.
    return new_arr

sum( nan_to_zero(arr) for arr in array_generator )

Nie powoduje to jednak NaN w ostatnim miejscu tablicy. Wynika to do 0 ...

1
mgilson 23 sierpień 2012, 17:12