Найти средние значения столбцов несортированного 2D-массива на основе последнего столбца в Python - PullRequest
0 голосов
/ 05 мая 2020

Я использую sh, чтобы найти средние значения каждого из столбцов (кроме последнего столбца) массива 2D NumPy. Последний столбец имеет классификатор / идентификатор. Итак, без сортировки массива на основе классификатора, я sh, чтобы найти среднее значение каждого столбца только на основе каждого классификатора. Ниже приведены примеры строк 2D-матрицы.

row1 = [1, 2, 3,...,0]
row2 = [2, 3, 4,...,1]
row3 = [3, 4, 5,...,0]
row4 = [4, 5, 6,...,1]
...
rowN = [9, 8, 7,...,0]

На основе строк выше, мне нужны средние значения каждого столбца 2D-массива только для строк, у которых classifier = 0, а затем classifier = 1. Есть ли способ pythoni c сделать это без операторов if и без предварительной сортировки массива?

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Если я правильно понял ваш вопрос: давайте представим, что это ваш 2D numpy массив:

import numpy as np
A =np.array([[1, 2, 3,0],[2, 3, 4,1], [3, 4, 5,0],[4, 5, 6,1]])

Это способ получить среднее значение каждого столбца на основе значения классификатора ( последний столбец в вашей матрице).

print('1-Classifier mean:',A[A[:,-1]==1].mean(axis=0)[:-1])
print('0-Classifier mean:',A[A[:,-1]==0].mean(axis=0)[:-1])

Результат:

1-Classifier mean: [3. 4. 5.]
0-Classifier mean: [2. 3. 4.]
1 голос
/ 05 мая 2020

Уловка, чтобы сделать это без использования if или сортировки, заключается в использовании ключа в качестве индекса, будь то для массива или dict, как я использую ниже.

Используя NumPy, это довольно легко использовать индексирование логических массивов и mean.

import numpy as np

def sum_by_col(array, keycol):
    key_arr = array[:, keycol]
    array = np.delete(array, keycol, axis=1)
    means = {}
    for key in np.unique(keys):
        means[key] = array[key_arr == key].mean(axis=0)
    return means

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

0 голосов
/ 06 мая 2020

Отфильтруйте строки по нужным вам значениям классификатора и вычислите среднее значение для всех столбцов, кроме последнего:

a   = # your matrix

classifier0 = a[:,-1]==0
mc0 = np.mean(a[classifier0,:-1],axis=0) 

classifier1 = a[:,-1]==1
mc1 = np.mean(a[classifier1,:-1],axis=0) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...