Я пытаюсь уменьшить D-мерный массив точек (D> 1). Шаги следующие:
- Генерирование D-мерной гистограммы
- Обрезка с максимальным значением 1
- Извлечение позиции тех бинов, где N = 1
Идея состоит в том, чтобы go из распределения точек, показанного слева, показывать справа (в 2D для визуализации здесь):
Первые два пункта просты, но я изо всех сил пытаюсь найти быстрый (это важно) способ решения третьей точки. То есть: из обрезанной гистограммы, как мне извлечь (как можно быстрее) координаты ребер, связанные с этими D-мерными (обрезанными) ячейками с 1 элементом внутри?
import numpy as np
N, D = 500, 3
# Random D-dimensional distribution of N points
arr = np.random.uniform(0., 10., (N, D))
# Some random number of bins
bins = np.random.randint(20, 40, D)
# D-dimensional histogram
hst, edges = np.histogramdd(arr, bins=bins)
# Clip at max=1
hst = np.clip(hst, a_min=None, a_max=1)
# This block below needs to be as fast as possible
# Find bins where there is 1 element
idxs = np.array(np.where(hst > 0)).T
# Extract coordinates
hst_dwnsmp = []
for pt in idxs:
coord = []
for i, j in enumerate(pt):
coord.append(edges[i][j])
hst_dwnsmp.append(coord)