#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])