созданы сгруппированные частоты на основе данных и интервалов классов - PullRequest
0 голосов
/ 23 февраля 2020

У меня небольшая проблема, связанная с задачей группового распределения частот, я прочитал данные из CSV-файла и рассчитал все необходимые параметры (min, max, range, clas_with, low_class, upper_class)

import pandas as pd
import numpy as np
import math
selected_data =np.array(pd.read_csv("data.csv"))
#  გამოვიანგარიშოთ ყველა საჭირო პარამეტრი
#მინიმალური და მაქსიმალური ელემენტი
min_element =np.min(selected_data)
max_element =np.max(selected_data)
# განვსაზღვროთ კლასების რაოდენობა
num_class =7  # ნებისმიერი რიცხვი  5  სა  და 20 ს შორის
# განვსაზღვროთ გაბნევის დიაპაზონი
range_interval =max_element - min_element
if range_interval % num_class ==0: # თუ არაა ნაშითი, გავზარდით კლასების რაოდენობა ერთით
     num_class =num_class+1
# განვსაზღვროთ კლასის სიგანე
width =math.ceil(range_interval /num_class)
# შევქმნათ  ქვედა  და ზედა კლასები
low_class =np.arange(min_element,max_element,width)
upper_clas = low_class + width -1

dont обратите внимание на комментарии, это на грузинском языке, моя задача - рассчитать частоты на основе выбранных данных, идея следующая: для пары границ low_class и upper_class я хочу знать, сколько элементов из исходной матрицы подходит, значения Низкий класс и верхний класс:

Значения Low_class:

[100 105 110 115 120 125 130]

Значения Upper_class

[104 109 114 119 124 129 134]

что я хочу, чтобы вычислить, сколько чисел помещается между

100-104, 105-109. , , конечно, те пары, которые я могу создать, используя команду zip, например print (list (zip (low_class, upper_class)))

вернет

[(100, 104), (105, 109), (110, 114), (115, 119), (120, 124), (125, 129), (130, 134)]

, но как рассчитать частоту? У меня есть пробовал следующий код

# class  pairs
class_pairs =list(zip(low_class,upper_clas))
list_result =[]
for (low_bound, upper_bound) in class_pairs:
    result =np.sum([selected_data>=low_bound and selected_data<=upper_bound])
    list_result.append(result)

, но выдает следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/Dato/PycharmProjects/my_first_python/read_data.py", line 25, in <module>
    result =np.sum([selected_data>=low_bound and selected_data<=upper_bound])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Использование np.sum в al oop, как это неэффективно. То, что вы хотите, это примерно то, что обеспечивает numpy .histogram .

Вот как его использовать:

# Note that list_result is a numpy array
list_result = numpy.histogram(selected_data, low_class + [max_element])[0]

Пример:

selected_data = [100, 101, 105, 111, 112, 113, 133]
low_class = [100, 105, 110, 115, 120, 125, 130]
max_element = 133
list_result = numpy.histogram(selected_data, low_class + [max_element])[0]
print(list_result)

Вывод:

[2 1 3 0 0 0 1]
0 голосов
/ 23 февраля 2020
  • Для объединения нескольких условий в массиве numpy необходимо использовать оператор &.
  • Ниже должен работать код.
# class  pairs
class_pairs =list(zip(low_class,upper_clas))
list_result =[]
for (low_bound, upper_bound) in class_pairs:
    result =np.sum(selected_data[(selected_data>=low_bound) & (selected_data<=upper_bound)])
    list_result.append(result)
  • Пример
import numpy as np
a = np.array([1,2,3,4,5,6,7])
np.sum(a[(a>=3) & (a<=6)])

вывод:

18

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