【问题标题】:Numpy median-of-means computation across unequal-sized array跨不等大小数组的 Numpy 均值计算
【发布时间】:2020-11-26 03:41:44
【问题描述】:

假设numpy 数组X 的形状为m x n 并输入float64X 的行需要通过按元素计算的均值中值。具体来说,m 行索引被划分为b“桶”,每个都包含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)

如果bm 相除,则此程序运行良好,因为np.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 不是二维数组,它不能用于索引X_bucketed

我怎样才能使这适用于大小不等的桶,即让程序计算每个桶内的平均值(无论其大小),然后计算桶的中位数?

我无法完全掌握masked arrays,我不确定是否可以在这里使用。

【问题讨论】:

    标签: python numpy median-of-medians


    【解决方案1】:

    您可以考虑分别计算每个桶的均值,然后堆叠并计算中位数。您也可以直接将array_split 用于X,无需使用切片索引数组对其进行索引(也许这是您的主要问题?)。

    m = 11
    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
    buckets = np.array_split(X, 2, axis = 0)
    
    # Compute the mean within each bucket
    b_means = [np.mean(x, axis=0) for x in buckets]
    
    # Compute the median-of-means
    median = np.median(np.array(b_means), axis=0)
    
    print(median) #(10000,) shaped array
    

    【讨论】:

    • 切片只是因为我正在洗牌(为简洁起见省略但现在添加)。我已将您的想法改编为我的代码(请参阅编辑),它似乎按预期工作。我只是想知道您是否可以让我了解这两种方法在速度方面的比较?我担心潜在的瓶颈,因为这应该大规模进行。
    • @mgus 我很快在一些不同的尺度上对其进行了测试,似乎第二种方法总是更快,这不是我的预期。很抱歉,我对时间效率没有太多了解。也许这篇文章会有所帮助。 why-isnt-numpy-mean-multithreaded
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多