一つの方法は、一度にすべての要素の合計を取得し、無効なものからの寄与を取り除くことであろう。最後に、平均値そのものを有効な要素の数で割る必要があります。
def mean_ignore_num(arr,num):
# Get count of invalid ones
invc = np.count_nonzero(arr==num)
# Get the average value for all numbers and remove contribution from num
return (arr.sum() - invc*num)/float(arr.size-invc)
を確認した結果 - -
In [191]: arr = np.full(10,2147483647).astype(np.int32)
...: arr[1] = 5
...: arr[4] = 4
...:
In [192]: arr.max()
Out[192]: 2147483647
In [193]: arr.sum() # Extends beyond int32 max limit, so no overflow
Out[193]: 17179869185
In [194]: arr[arr != 2147483647].mean()
Out[194]: 4.5
In [195]: mean_ignore_num(arr,2147483647)
Out[195]: 4.5
ランタイムテスト -
In [38]: arr = np.random.randint(0,9,(10000))
In [39]: arr[arr != 7].mean()
Out[39]: 3.6704609489462414
In [40]: mean_ignore_num(arr,7)
Out[40]: 3.6704609489462414
In [41]: %timeit arr[arr != 7].mean()
10000 loops, best of 3: 102 µs per loop
In [42]: %timeit mean_ignore_num(arr,7)
10000 loops, best of 3: 36.6 µs per loop
、これが最も効率的な方法ですので、我々はそうのような実装を持っているでしょうか?私は数百万の値を持つ配列を数百万個まで持つことができますので、パフォーマンスの向上が本当の違いになります。 (私はちょうどそれを指定した編集を行いました) –
そして、あなたは 'nanmean'のことはどうやって正確に動作しますか?そこには:https://github.com/numpy/numpy/blob/master/numpy/lib/nanfunctions.py#L803 NANがたくさんある場合、バージョンがメモリ効率が高くなるという点を除いて、基本的に同じことです。 NANは、配列全体の余分なキャストを引き起こす浮動小数点数に対してのみ定義されることに注意してください。 – JohnW
スピードに関して、まずそれをテストしてください。**これが問題になったら、戻ってください。 – JohnW