8

何千もの4D配列を要素ごとに追加し、nansを考慮したいと思います。1D配列を使用した簡単な例は次のとおりです。

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

私はこれを回避するための単純なforループを作成しましたが、それは永遠にかかります-賢い解決策ではありません。別の解決策は、より大きなアレイを作成してボトルネックのnansumを使用することですが、これは私のラップトップには多すぎるメモリを消費します。11000ケースを超えるランニングサムが必要です。

誰かがこれを行うための賢くて速い方法を持っていますか?

4

5 に答える 5

10

これが1つの可能性です:

>>> 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.])

nan本当の難しさは、特定の位置のすべての値が。でない限り、ゼロとして解釈されたいように見えることですnan。これは、xとyの両方を調べて、どのnanを置き換えるかを決定する必要があることを意味します。すべてのnan値を置き換えても問題がない場合は、単純に行うことができますnp.nan_to_num(x) + np.nan_to_num(y)

于 2012-08-23T17:20:55.850 に答える
3

あなたは次のようなことをすることができます:

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

NaN両方がそのインデックスにある配列内の場所を検索します。NaN次に、コピーを作成してsを0.0に置き換え、2つの配列を一緒に追加してから、上記のフラグ付きインデックスを。に置き換えるなど、基本的に@mgilsonが提案したことを実行しnp.NaNます。

于 2012-08-23T17:23:28.843 に答える
3
import numpy as np
z=np.nansum([X,Y],axis=0)
于 2013-09-24T12:29:18.747 に答える
1

これがどのように機能するかはわかりませんが、一見の価値があります:)

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 )

NaNただし、これは配列の最後の場所にはなりません。結果は0になります...

于 2012-08-23T17:12:12.553 に答える
1

私はいくつかのより簡単な解決策を見ます:

  • 編集済み)を使用してnp.ma

    mX = np.ma.masked_array(X, mask=np.isnan(X))
    mY = np.ma.masked_array(Y, mask=np.isnan(Y))
    mZ = np.ma.masked_array(mX.filled(0) + mY.filled(0),
                            mask=mX.mask * mY.mask)
    Z = mZ.filled(np.nan)
    
  • 編集済み)使用しないnp.ma

    mx = np.isnan(x)
    my = np.isnan(y)
    z = np.where(mx,0,x) + np.where(my,0,y)
    z[mx&my] = np.nan
    
于 2012-08-24T20:42:42.663 に答える