Если я правильно понимаю, вы хотите построить маску на исходных точках, указывающую, что точка принадлежит ячейке с более чем 5 точками.
Чтобы построить такую маску, np.histogram2d
возвращает количество для каждой ячейки, но не указывает, какая точка в какую ячейку попадает.
Вы можете построить такую маску, перебирая каждую ячейку, которая удовлетворяет условию, и добавляя все соответствующие индексы точек к маске.
Для визуализации результата np.histogram2d
можно использовать plt.pcolormesh
. Рисование me sh с h > 5
покажет все значения True
с наивысшим цветом (красный) и значения False
с самым низким цветом (синий).
from matplotlib import pyplot as plt
import numpy as np
x = np.random.uniform(0, 2, 500)
y = np.random.uniform(0, 1, x.shape)
xedges = np.array([0.1, 0.2, 0.5, 0.55, 0.6, 0.8, 1.0, 1.3, 1.5, 1.9])
yedges = np.array([0.1, 0.2, 0.4, 0.5, 0.55, 0.6, 0.8, 0.9])
hist, _xedges, _yedges = np.histogram2d(x, y, bins=[xedges, yedges])
h = hist.T # np.histogram2d transposes x and y, therefore, transpose the resulting array
thres = 5
desired = h > thres
plt.pcolormesh(xedges, yedges, desired, cmap='coolwarm', ec='white', lw=2)
mask = np.zeros_like(x, dtype=np.bool) # start with mask all False
for i in range(len(xedges) - 1):
for j in range(len(yedges) - 1):
if desired[j, i]:
# print(f'x from {xedges[i]} to {xedges[i + 1]} y from {yedges[j]} to {yedges[j + 1]}')
mask = np.logical_or(mask, (x >= xedges[i]) & (x < xedges[i + 1]) & (y >= yedges[j]) & (y < yedges[j + 1]))
# plt.scatter(np.random.uniform(xedges[i], xedges[i+1], 100), np.random.uniform(yedges[j], yedges[j+1], 100),
# marker='o', color='g', alpha=0.3)
plt.scatter(x, y, marker='o', color='gold', label='initial points')
plt.scatter(x[mask], y[mask], marker='.', color='green', label='filtered points')
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left')
plt.tight_layout()
plt.show()
Обратите внимание, что в данном примере ребра не покрывают весь диапазон точек. Точки за пределами заданных ребер учитываться не будут. Чтобы включить эти точки, просто вытяните края.