Как классифицировать числовые данные в массиве numpy итеративно?

#python #arrays #numpy #for-loop

#python #массивы #numpy #for-цикл

Вопрос:

В настоящее время я пытаюсь сгенерировать массив numpy со случайными данными normal = np.round(np.random.normal(loc=0.0,scale=1000,size=(size)),1).astype(int) , seed = np.random.seed(0) а затем классифицировать их равноудаленным способом, например:

 d=10
data = np.ndarray.flatten(np.asarray(normal,dtype=int))

interval = np.divide(np.max(data)-np.min(data),d)
intervals = np.arange(np.min(data),np.max(data),interval,dtype=int)

        for x in range(len(data)):
            for z in range(d-1):
                if data[x] >= intervals[z] and data[x] < intervals[z 1]:
                    data[x] = z
                elif data[x] > intervals[-1]:
                    data[x] = d-1
 

В идеале, когда я делаю это, я ожидаю, что значения в моем массиве данных будут заменены значениями от 0 до 9, но всякий раз, когда я запускаю это, я получаю значения от 4-8. У кого-нибудь есть идея, что я могу делать неправильно или как улучшить этот метод?

Интервал — это используемое значение дельты, а интервалы — фактические граничные значения для соответствующих интервалов.

Ответ №1:

Вы перезаписываете данные при проверке правильного интервала. Введите другой массив данных, который вы заполняете по ходу работы, оставляя исходные данные нетронутыми:

 import numpy as np
import matplotlib.pyplot as plt

size = 1000
seed = np.random.seed(0)
normal = np.round(np.random.normal(loc=0.0, scale=1000, size=(size)), 1).astype(int)

d=10
data = np.ndarray.flatten(np.asarray(normal, dtype=int))

interval = np.divide(np.max(data)-np.min(data), d)
intervals = np.arange(np.min(data), np.max(data), interval, dtype=int)

data_d = np.zeros_like(data) # added

for x in range(len(data)):
    for z in range(d-1):
        if data[x] >= intervals[z] and data[x] < intervals[z 1]: # check original data
            data_d[x] = z # fill new array so not to overwrite
        elif data[x] > intervals[-1]:
            data_d[x] = d-1
            
plt.hist(data_d)
plt.show()
 

который выдает (все принятые значения):

введите описание изображения здесь

Ответ №2:

 x = np.array([0.2, 6.4, 3.0, 1.6])
bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
inds = np.digitize(x, bins)
inds # array([1, 4, 3, 2])