Как найти корзину с наибольшим количеством, используя np.hist2D () - PullRequest
0 голосов
/ 04 февраля 2020

Есть ли способ найти корзину с наибольшим количеством от np.hist2D(). Пока мой код:

counts, xedges, yedges = np.histogram2d(x,y bins=100) # x and y are two lists of numbers
print (len(counts), len(xedges), len(yedges)) # 100 101 101

Мне удалось получить counts, но я старался связать это с краями x и y.

Спасибо.

Обновление:

Я решил это - любые более подходящие решения приветствуются.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Чтобы получить максимум, используйте counts.max(). Чтобы получить максимальные индексы, используйте argmax, затем unravel_index, как в np.unravel_index(np.argmax(counts), counts.shape). Индексы можно использовать для поиска ребер x и y.

Вот пример вместе с визуализацией, показывающей, как все сходится, и для проверки результата. Обратите внимание, что bins=100 генерирует 10000 корзин; в этом примере для получения четкого графика используются только 10 корзин в каждом направлении.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

N = 200
x = np.random.uniform(0, 80, N)
y = np.random.uniform(0, 40, N)

counts, xedges, yedges = np.histogram2d(x, y, bins=(10, 10))

x_ind, y_ind = np.unravel_index(np.argmax(counts), counts.shape)
print(f'The maximum count is {counts[x_ind][y_ind]:.0f} at index ({x_ind}, {y_ind})')
print(f'Between x values {xedges[x_ind]} and {xedges[x_ind+1]}')
print(f'and between y values {yedges[y_ind]} and {yedges[y_ind+1]}')

fig, (ax1, ax2) = plt.subplots(ncols=2)

ax1.scatter(x,y,marker='.',s=20,lw=0)
rect = Rectangle((xedges[x_ind], yedges[y_ind]), xedges[x_ind+1] - xedges[x_ind], yedges[y_ind+1] - yedges[y_ind],
                 linewidth=1,edgecolor='crimson',facecolor='none')
ax1.add_patch(rect)
ax1.set_title(f'max count: {counts[x_ind][y_ind]:.0f}')

ax2.imshow(counts.T, origin='lower')
ax2.plot(x_ind, y_ind, 'or')
ax2.set_title('heatmap')

plt.show()

resulting plot

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

Использование:

cou =[]
for x in range (0, 100):
    for y in range (0, 100):
        c = counts[x][y]
        cou.append(c)
print (max(cou))
...