假设一个numpy
数组X
的形状为m x n
,类型为float64
。X
的行需要通过按元素计算的平均值中位数。具体地说,m
行索引被划分为b
“bucket”,每个bucket包含m/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)
如果b
除以m
,则此程序运行良好,因为np.array_split()
会将索引等分,并且数组buckets
是二维数组
但是,如果b
不除以m
,则它不起作用。在这种情况下,np.array_split()仍然拆分为b
个大小不等的bucket,这对我来说很好。例如,如果b = 3
,它将把索引{0,1,…,9}分成[0123]、[456]和[789]。这些数组不能相互堆叠,因此数组buckets
不是二维数组,不能用于索引X_bucketed
对于大小不等的桶,我如何才能做到这一点,即让程序计算每个桶内的平均值(无论大小),然后计算桶间的中值
我不能完全理解masked arrays,我不确定这些是否可以在这里使用
array_split
到X,不需要使用切片索引数组对其进行索引(可能这是您的主要问题?)相关问题 更多 >
编程相关推荐