11

私は簡潔な方法を探しています:

 a = numpy.array([1,4,1,numpy.nan,2,numpy.nan])

に:

  b = numpy.array([1,5,6,numpy.nan,8,numpy.nan])

私が現在できる最善のことは次のとおりです。

b = numpy.insert(numpy.cumsum(a[numpy.isfinite(a)]), (numpy.argwhere(numpy.isnan(a)) - numpy.arange(len(numpy.argwhere(numpy.isnan(a))))), numpy.nan)

同じことを達成するためのより短い方法はありますか?2D 配列の軸に沿って cumsum を実行するのはどうですか?

4

3 に答える 3

8

Pandasの上に構築されたライブラリですnumpy。この Seriesクラスにはcumsum、を保持するメソッドがあり、nanDSMによって提案されたソリューションよりもかなり高速です。

In [15]: a = arange(10000.0)

In [16]: a[1] = np.nan

In [17]: %timeit a*0 + np.nan_to_num(a).cumsum()
1000 loops, best of 3: 465 us per loop

In [18] s = pd.Series(a)

In [19]: s.cumsum()
Out[19]: 
0       0
1     NaN
2       2
3       5
...
9996    49965005
9997    49975002
9998    49985000
9999    49994999
Length: 10000

In [20]: %timeit s.cumsum()
10000 loops, best of 3: 175 us per loop
于 2012-10-24T19:51:07.550 に答える
7

どうですか(大きすぎない配列の場合):

In [34]: import numpy as np

In [35]: a = np.array([1,4,1,np.nan,2,np.nan])

In [36]: a*0 + np.nan_to_num(a).cumsum()
Out[36]: array([  1.,   5.,   6.,  nan,   8.,  nan])
于 2012-10-24T14:26:32.783 に答える
5

マスクされた配列は、まさにこのタイプの状況に対応しています。

>>> import numpy as np
>>> from numpy import ma
>>> a = np.array([1,4,1,np.nan,2,np.nan])
>>> b = ma.masked_array(a,mask = (np.isnan(a) | np.isinf(a)))
>>> b
masked_array(data = [1.0 4.0 1.0 -- 2.0 --],
         mask = [False False False  True False  True],
   fill_value = 1e+20)
>>> c = b.cumsum()
>>> c
masked_array(data = [1.0 5.0 6.0 -- 8.0 --],
         mask = [False False False  True False  True],
   fill_value = 1e+20)
>>> c.filled(np.nan)
array([  1.,   5.,   6.,  nan,   8.,  nan])
于 2012-10-24T14:42:58.587 に答える