Конвертировать массив значений со значениями в массив с частотой для каждого наблюдения в каждой строке - PullRequest
0 голосов
/ 28 мая 2018

У меня есть пустой массив следующим образом:

array = np.random.randint(6, size=(50, 400))

В этом массиве есть кластер, к которому относится каждое значение, каждая строка представляет образец, а каждый столбец представляет объект, но я хотел бы создать5-мерный массив с частотой каждого кластера (в каждой выборке, представленной в виде строки в этой матрице).

Однако при расчете частоты я хочу игнорировать 0, что означает, что частота всех значенийкроме 0 (1-5) следует добавить к 1.

По сути, я хочу массив, в котором каждая строка является кластером (1-5) в этом случае, и каждая строка по-прежнему содержит одну выборку.

Как это можно сделать?

Редактировать:

маленький ввод:

input = np.random.randint(6, size=(2, 5))

array([[0, 4, 2, 3, 0],
       [5, 5, 2, 5, 3]])

вывод:

1    2    3    4    5

0   .33  .33  .33   0
0   .2   .2    0   .6    

Где1-5 - это имена строк, а две нижние строки - это желаемый результат в массиве с пустым фрагментом.

1 Ответ

0 голосов
/ 28 мая 2018

Это простое приложение bincount.Делает ли это то, что вам нужно?

def freqs(x):
    counts = np.bincount(x, minlength=6)[1:]
    return counts/counts.sum()

frequencies = np.apply_along_axis(freqs, axis=1, arr=array)

Если вам было интересно узнать о влиянии скорости на apply_along_axis, этот метод с использованием сложного индексирования в моих тестах незначительно медленнее:

counts = (array[:, :, None] == values[None, None, :]).sum(axis=1)
frequencies2 = counts/counts.sum(axis=1)[:, None]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...