У меня есть двумерный массив с размером (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
удваиваются.Если кто-то знает почему, можно указать мне?
Теперь оба решения возвращают одно и то же средство.