Matplotlib histogram2d нормализовать не равно 1

102
7

Имея один из тех дней, я не могу понять, что происходит. У меня есть инструмент, который генерирует 2D-гистограммы из массивов (массивов Numpy) X, Y, Z-коордов (Z неважно в минуту). Мне нужно, чтобы результаты были нормализованы, поэтому я могу сделать некоторые дальнейшие вычисления. Однако при использовании команды normed = True сумма массива всегда находится где-то около 0,000006.

Я хочу нормализовать всю гистограмму, поэтому все элементы массива будут содержать до 1. Установка, нормированная на False, правильно возвращает количество выборок в бункере, но, очевидно, это не нормируется. Я тестировал его с массивами из 3k элементов вплоть до 30k и все еще той же проблемой. Для записи мои данные включают минус-координаты на всех трех осях.

Код выглядит следующим образом:

def histogrammer(coords):      # coords is a 3D numpy array

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0]), normed=True)
H.shape, xedges.shape, yedges.shape
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]]

global displayHistograms
if displayHistograms == True:
print('Displaying:')
plt.imshow(H, extent=extent, interpolation='nearest')
plt.colorbar()
plt.show()

print('{0:.30f}'.format(np.sum(H))) # Debug normalisation

return H

Я запускаю этот код для двух массивов, создавая две разные гистограммы. Операторы печати для каждого:

0.000006250000000000000299510850
0.000006250000000000002840609692

Может ли кто-нибудь посоветовать, где я ошибаюсь? Заранее благодарю за любую помощь!

спросил(а) 2021-01-19T18:03:32+03:00 9 месяцев, 1 неделя назад
1
Решение
103

normed=True нормализует объем (т.е. сумму binarea*binheight) до 1, а не сумму высот. Потому что так вы обычно нормализуете гистограмму, так как нормированная гистограмма является оценкой функции плотности вероятности.

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

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0]))
H_normalized = H/float(coords.shape[0])

ответил(а) 2021-01-19T18:03:32+03:00 9 месяцев, 1 неделя назад
46

Установка normed = True дает плотность bin, а не долю от общего количества элементов в корзине. Вам нужно будет вычислить это из ширины бункера или вручную.

ответил(а) 2021-01-19T18:03:32+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема