0

shapeと typeのnumpy配列を想定します。の行は、要素ごとの平均の中央値計算を通過する必要があります。具体的には、行インデックスは「バケット」に分割され、それぞれにそのようなインデックスが含まれます。次に、各バケット内で平均を計算し、結果の平均全体で最終的な中央値の計算を行います。Xm x nfloat64Xmbm/b

それを明確にする例は

import numpy as np

m = 10
n = 10000

# A random data matrix
X = np.random.uniform(low=0.0, high=1.0, size=(m,n)).astype(np.float64)

# Number of buckets to split rows into
b = 5

# Partition the rows of X into b buckets
row_indices = np.arange(X.shape[0])
buckets = np.array(np.array_split(row_indices, b))
X_bucketed = X[buckets, :]

# Compute the mean within each bucket
bucket_means = np.mean(X_bucketed, axis=1)

# Compute the median-of-means
median = np.median(bucket_means, axis=0)

# Edit - Method 2 (based on answer)
np.random.shuffle(row_indices)
X = X[row_indices, :]
buckets2 = np.array_split(X, b, axis=0)
bucket_means2 = [np.mean(x, axis=0) for x in buckets2]
median2 = np.median(np.array(bucket_means2), axis=0)

このプログラムは、インデックスを等分に分割し、配列が 2D 配列であるため、b除算の場合は問題なく動作します。mnp.array_split()buckets

ただし、 をb割らないとうまくいきませんm。その場合、np.array_split()は引き続きバケットに分割されますbが、サイズが等しくないため、私の目的には問題ありません。たとえばb = 3、インデックス {0,1,...,9} を [0 1 2 3]、[4 5 6]、および [7 8 9] に分割する場合。これらの配列は互いに積み重ねることができないため、配列bucketsは 2D 配列ではなく、インデックスに使用できませんX_bucketed

サイズが等しくないバケットに対してこれを機能させるにはどうすればよいですか。つまり、プログラムに各バケット内の平均を (サイズに関係なく) 計算させてから、バケット全体の中央値を計算させるにはどうすればよいですか?

マスクされた配列を完全に把握できず、ここで使用できるかどうかわかりません。

4

1 に答える 1