Как проверить наличие строки в массиве, создать ее, если она не существует, или изменить ее, если она существует в python - PullRequest
0 голосов
/ 18 марта 2020

Работая из несортированного массива, я пытаюсь вычислить среднее значение для подмножества указанного c типа. То есть любая заданная строка имеет тип и значение, где тип представляет собой целое число некоторого значения (повторяется в некотором диапазоне), а значение представляет собой число с плавающей запятой. Например:

import numpy as np
np.data=array([[1,1.3],[2,2.2],[3,3.7],[4,5.1],[1,1.25],[2,2.3],[3,3.4]])

(Реальным решением этой проблемы может быть «найти средний доход по возрасту для людей в списке»; а затем я собираюсь построить график зависимости дохода от возраста)

Как найти среднее значение для всех значений типа 1? Например (np.data [0,1] + np.data [4,1]) / 2

В настоящее время я пытаюсь скомпилировать свое среднее значение в новом массиве с моим типом, совокупным значением и счетчиком (затем в конце я разделю совокупное значение на счетчик, чтобы получить среднее значение). Поэтому я определяю новый массив, а затем пытаюсь проверить, есть ли запись для текущего типа. Если есть, добавьте к совокупному значению и итерируйте счетчик, если не создайте новую строку. Но как это проверить? Это может быть неправильная структура (если вместо try?) И np.where возвращает массив. Множество проблем, но я стараюсь упорядочить их, поскольку в моем массиве данных миллионы записей.

# avg = [type, cumulative val,counter]
# data = [type, value]
for i in xrange(1,len(data)):
  try:
    # find if there is already cumulative data for type of this data
    k = np.where(np.avg==data[i,0]) # this isn't right
    # if data is accumulating for this type, add and increment
    avg[k[0],1]+=data[i,1]
    avg[k[0],2]+=1
  except IndexError:
    # if there is no data for this type, add new row to array
    np.concatenate((avg,data[i]))

Редактировать: Я нашел этот вопрос и ответ. Поэтому я поместил свой «возраст» (тип) в качестве записей в словаре (если тип еще не существует, он добавлен), зациклив на все записи, в результате чего список значений для каждого типа:

data = {1: [0.9, 0.95, 0.85, 0.92,], 2: [1.8, 1.7, 1.9,1.83], ...]

Тогда я могу l oop по данным и усреднить каждый список. Кажется, что он работает довольно эффективно (не замедляйте работу с умеренно большими наборами данных). Возможно, pandas будет лучше, но сейчас я воспользуюсь этим.

1 Ответ

0 голосов
/ 19 марта 2020

Я нашел этот вопрос и ответ. Поэтому я поместил свой «возраст» (тип) в качестве записей в словаре (если тип еще не существует, он добавлен), зациклив на все записи, в результате чего список значений для каждого типа:

data = {1: [0.9, 0.95, 0.85, 0.92,], 2: [1.8, 1.7, 1.9,1.83], ...]

Тогда я могу l oop по данным и усреднить каждый список. Кажется, что он работает довольно эффективно (не замедляйте работу с умеренно большими наборами данных). Возможно, pandas будет лучше, но сейчас я воспользуюсь этим.

...