3

重複の可能性:
ゼロ値を考慮せずに numpy を使用した多数の配列の平均

私はnumpyに取り組んでおり、同じサイズと形状の配列がいくつかあります。それらは 500*500 です。いくつかの Null 値があります。元の配列の要素を 1 つずつ平均した結果の配列が必要です。例えば:

A=[ 1 Null 8 Null; Null 4 6 1]
B=[ 8 5 8 Null; 5 9 5 3]

結果の配列は次のようになります。

C=[ 4.5 5 8 Null; 5 6.5 5.5 2]

どうやってやるの?

4

2 に答える 2

6

更新:NumPy 1.8では、の代わりにnp.nanmeanscipy.stats.nanmeanを使用できます。


持っている場合は、 scipy.stats.nanmeanscipyを使用できます:

In [2]: import numpy as np

In [45]: import scipy.stats as stats

In [3]: nan = np.nan

In [43]: A = np.array([1, nan, 8, nan, nan, 4, 6, 1])   
In [44]: B = np.array([8, 5, 8, nan, 5, 9, 5, 3])  
In [46]: C = np.array([A, B])    
In [47]: C
Out[47]: 
array([[  1.,  nan,   8.,  nan,  nan,   4.,   6.,   1.],
       [  8.,   5.,   8.,  nan,   5.,   9.,   5.,   3.]])

In [48]: stats.nanmean(C)
Warning: invalid value encountered in divide
Out[48]: array([ 4.5,  5. ,  8. ,  nan,  5. ,  6.5,  5.5,  2. ])

他のnumpyのみ(マスクされた配列)のソリューションは、ここにあります。つまり、

In [60]: C = np.array([A, B])    
In [61]: C = np.ma.masked_array(C, np.isnan(C))    
In [62]: C
Out[62]: 
masked_array(data =
 [[1.0 -- 8.0 -- -- 4.0 6.0 1.0]
 [8.0 5.0 8.0 -- 5.0 9.0 5.0 3.0]],
             mask =
 [[False  True False  True  True False False False]
 [False False False  True False False False False]],
       fill_value = 1e+20)

In [63]: np.mean(C, axis = 0)
Out[63]: 
masked_array(data = [4.5 5.0 8.0 -- 5.0 6.5 5.5 2.0],
             mask = [False False False  True False False False False],
       fill_value = 1e+20)

In [66]: np.ma.filled(np.mean(C, axis = 0), nan)
Out[67]: array([ 4.5,  5. ,  8. ,  nan,  5. ,  6.5,  5.5,  2. ])
于 2012-11-08T11:43:23.013 に答える
1
  1. Noneのようなリストから始めます (の代わりに を使用することもできます0)

    A = [1, 0, 8, 0, 0, 4, 6, 1]
    B = [8, 5, 8, 0, 5, 9, 5, 3]
    
  2. 次に、次のようなリストが必要です。

    lst = [A, B]
    
  3. 数値のリストの平均を計算する関数を定義します。

    def mean(nums):
        return float(sum(nums)) / len(nums) if nums else 0
    
  4. 最後に、次の方法で平均を計算できます。

    C = [mean(filter(None, col)) for col in zip(*list)]
    
于 2012-11-08T11:49:27.577 に答える