11

長さが異なる可能性がある場合、複数の配列の平均を計算することは可能ですか?numpyを使用しています。だから私が持っているとしましょう:

numpy.array([[1, 2, 3, 4, 8],    [3, 4, 5, 6, 0]])
numpy.array([[5, 6, 7, 8, 7, 8], [7, 8, 9, 10, 11, 12]])
numpy.array([[1, 2, 3, 4],       [5, 6, 7, 8]])

ここで、平均を計算したいのですが、「欠落している」要素を無視します(当然、平均を台無しにするため、ゼロを追加することはできません)

配列を反復処理せずにこれを行う方法はありますか?

PS。これらの配列はすべて2次元ですが、その配列に対して常に同じ量の座標があります。つまり、1番目の配列は5と5、2番目の配列は6と6、3番目の配列は4と4です。

例:

np.array([[1, 2],    [3, 4]])
np.array([[1, 2, 3], [3, 4, 5]])
np.array([[7],       [8]])

これは与える必要があります

(1+1+7)/3  (2+2)/2   3/1
(3+3+8)/3  (4+4)/2   5/1

そしてグラフィカルに:

[1, 2]    [1, 2, 3]    [7]
[3, 4]    [3, 4, 5]    [8]

ここで、これらの2次元配列が互いに重なり合って配置され、座標が重なり合ってその座標の平均に寄与していると想像してください。

4

4 に答える 4

11

numpy.ma.meanを使用すると、マスクされていない配列要素の平均を計算できます。ただし、を使用するnumpy.ma.meanには、最初に3つのnumpy配列を1つのマスクされた配列に結合する必要があります。

import numpy as np
x = np.array([[1, 2], [3, 4]])
y = np.array([[1, 2, 3], [3, 4, 5]])
z = np.array([[7], [8]])

arr = np.ma.empty((2,3,3))
arr.mask = True
arr[:x.shape[0],:x.shape[1],0] = x
arr[:y.shape[0],:y.shape[1],1] = y
arr[:z.shape[0],:z.shape[1],2] = z
print(arr.mean(axis = 2))

収量

[[3.0 2.0 3.0]
 [4.66666666667 4.0 5.0]]
于 2012-04-07T21:24:56.893 に答える
9

さまざまな長さのパフォーマンス曲線の平均をプロットするために、これが必要になることがよくありました。

異なる長さの複数の曲線のプロット

簡単な関数で解決しました(@unutbuの回答に基づく):

def tolerant_mean(arrs):
    lens = [len(i) for i in arrs]
    arr = np.ma.empty((np.max(lens),len(arrs)))
    arr.mask = True
    for idx, l in enumerate(arrs):
        arr[:len(l),idx] = l
    return arr.mean(axis = -1), arr.std(axis=-1)

y, error = tolerant_mean(list_of_ys_diff_len)
ax.plot(np.arange(len(y))+1, y, color='green')

したがって、その関数を上記のプロットされた曲線のリストに適用すると、次のようになります。

さまざまな長さのさまざまな曲線の平均と標準のプロット

于 2019-12-11T08:21:46.400 に答える
2

以下の関数は、異なる長さの配列の列を追加することによっても機能します。

def avgNestedLists(nested_vals):
    """
    Averages a 2-D array and returns a 1-D array of all of the columns
    averaged together, regardless of their dimensions.
    """
    output = []
    maximum = 0
    for lst in nested_vals:
        if len(lst) > maximum:
            maximum = len(lst)
    for index in range(maximum): # Go through each index of longest list
        temp = []
        for lst in nested_vals: # Go through each list
            if index < len(lst): # If not an index error
                temp.append(lst[index])
        output.append(np.nanmean(temp))
    return output

最初の例から外れます:

avgNestedLists([[1, 2, 3, 4, 8], [5, 6, 7, 8, 7, 8], [1, 2, 3, 4]])

出力:

[2.3333333333333335,
 3.3333333333333335,
 4.333333333333333,
 5.333333333333333,
 7.5,
 8.0]

np.amax(nested_lst)またはnp.max(nested_lst)が最初に最大値を見つけるために使用されなかった理由は、ネストされたリストのサイズが異なる場合に配列を返すためです。

于 2017-07-14T00:07:33.157 に答える
1

OP、あなたが非反復的な組み込みソリューションを探していたのは知っていますが、以下は実際には3行しかかかりません(組み合わせるtransposeと2行になりますmeansが、それでは面倒になります)。

arrays = [
    np.array([1,2], [3,4]),
    np.array([1,2,3], [3,4,5]),
    np.array([7], [8])
    ]

mean = lambda x: sum(x)/float(len(x)) 

transpose = [[item[i] for item in arrays] for i in range(len(arrays[0]))]

means = [[mean(j[i] for j in t if i < len(j)) for i in range(len(max(t, key = len)))] for t in transpose]

出力:

>>>means
[[3.0, 2.0, 3.0], [4.666666666666667, 4.0, 5.0]]
于 2012-04-08T15:40:33.170 に答える