Вычислить среднее значение и дисперсию для определенных столбцов двумерного массива, только если выполняется условие для элемента в каждой строке - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть двумерный массив с размером (690L, 15L).Мне нужно вычислить среднее значение столбцов для этого набора данных только в некоторых отдельных столбцах, но с условием: мне нужно включить строку тогда и только тогда, когда элемент в той же строке в определенном столбце удовлетворяет условию.Позвольте мне прояснить ситуацию с некоторым кодом.

f = open("data.data")
dataset =  np.loadtxt(fname = f, delimiter = ',')

У меня есть массив с заполненными индексами, где мне нужно выполнить среднее (и дисперсию)

index_catego = [0, 3, 4, 5, 7, 8, 10, 11]

Условие состоит в том, что dataset[i, 14] == 1 В качестве вывода я хочу 1D массив с длиной, такой как len(index_catego), где каждый элемент этого массива является средним значением ранее столбцов

output = [mean_of_index_0, mean_of_index_3, ..., mean_of_index_11]

Я недавно использую Python, но я уверен, что есть крутой способделать это с np.where, mask, np.mean или чем-то еще.

Я уже реализую решение, но оно не элегантно, и я не уверен, что оно правильное.

import numpy as np

index_catego = [0, 3, 4, 5, 7, 8, 10, 11]

matrix_mean_positive = []
matrix_variance_positive = []
matrix_mean_negative = []
matrix_variance_negative = []

n_positive = 0
n_negative = 0

sum_positive = np.empty(len(index_catego))
sum_negative = np.empty(len(index_catego))


for i in range(dataset.shape[0]):
    if dataset[i, 14] == 0:
        n_positive = n_positive + 1
        j = 0
        for k in index_catego:
            sum_positive[j] = sum_positive[j] + dataset[i, k]
            j = j + 1
    else:
        n_negative = n_negative + 1
        j = 0
        for k in index_catego:
            sum_negative[j] = sum_negative[j] + dataset[i, k]
            j = j + 1

for item in np.nditer(sum_positive):
    matrix_mean_positive.append(item / n_positive)

for item in np.nditer(sum_negative):
    matrix_mean_negative.append(item / n_negative)

print(matrix_mean_positive)
print(matrix_mean_negative)

Если вы хотите попробовать свое решение, я привожу пример данных

1,22.08,11.46,2,4,4,1.585,0,0,0,1,2,100,1213,0
0,22.67,7,2,8,4,0.165,0,0,0,0,2,160,1,0
0,29.58,1.75,1,4,4,1.25,0,0,0,1,2,280,1,0
0,21.67,11.5,1,5,3,0,1,1,11,1,2,0,1,1
1,20.17,8.17,2,6,4,1.96,1,1,14,0,2,60,159,1
0,15.83,0.585,2,8,8,1.5,1,1,2,0,2,100,1,1
1,17.42,6.5,2,3,4,0.125,0,0,0,0,2,60,101,0

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ 1: Я пробовал с этим

output_positive = dataset[:, index_catego][dataset[:, 14] == 0]
mean_p = output_positive.mean(axis = 0)
print(mean_p)

output_negative = dataset[:, index_catego][dataset[:, 14] == 1]
mean_n = output_negative.mean(axis = 0)
print(mean_n)

, но средства, вычисленные по первому (решение не круто) и второму решению (одна линия крутого решения), все разные.Я проверил, что dataset[:, index_catego][dataset[:, 14] == 0] и dataset[:, index_catego][dataset[:, 14] == 1] выбрано и кажется правильным (правильный размер и правый элемент).

ОБНОВЛЕНИЕ 2: Хорошо, первое решение неверно, потому что (например)первый столбец имеет в качестве элемента только 0 и 1, но как среднее значение возвращает значение> 1. Я не знаю, где я потерпел неудачу.Кажется, что положительный класс верен (или, по крайней мере, правдоподобен), а отрицательный класс даже не правдоподобен.

Итак, верно ли второе решение?Есть ли лучший способ сделать это?

ОБНОВЛЕНИЕ 3: Я думаю, что я нашел проблему с первым решением: я использую ноутбук Jupyter и иногда (не всегда), когда яПерезапустите ту же ячейку, где находится первое решение, элементы в matrix_mean_positive и matrix_mean_negative удваиваются.Если кто-то знает почему, можно указать мне?

Теперь оба решения возвращают одно и то же средство.

1 Ответ

0 голосов
/ 15 сентября 2018

Do Kernel-> Перезагрузка в ноутбуке jupyter для очистки памяти перед повторным запуском

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...