Numpy вычисление медианы средних значений в массиве неравного размера - PullRequest
0 голосов
/ 06 августа 2020

Предположим, что numpy массив X имеет форму m x n и введите float64. Строки X должны пройти поэлементное вычисление медианы средних значений. В частности, индексы строк 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)

Эта программа отлично работает, если b делит m, поскольку 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 не является 2D-массивом, и его нельзя использовать для индексации X_bucketed.

Как я могу сделать эту работу для ведер неравного размера, т. Е. чтобы программа вычисляла среднее значение в каждом сегменте (независимо от его размера), а затем медиану по сегментам?

Я не могу полностью обработать asp маскированные массивы и я не уверен если их можно использовать здесь.

1 Ответ

1 голос
/ 06 августа 2020

Вы можете рассмотреть возможность вычисления среднего значения каждого сегмента отдельно, затем суммировать и вычислить медианное значение. Также вы можете просто использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...