Применение scipy.stats.gaussian_kde к трехмерному облаку точек - PullRequest
0 голосов
/ 09 мая 2020

У меня есть набор из примерно 33K (x, y, z) точек в файле csv, и я хотел бы преобразовать его в сетку значений плотности с помощью scipy.stats.gaussian_kde. Мне не удалось найти способ преобразовать этот массив облаков точек в соответствующий формат ввода для функции gaussian_kde (а затем взять результат этого и преобразовать его в сетку значений плотности). Может ли кто-нибудь предоставить образец кода?

1 Ответ

2 голосов
/ 09 мая 2020

Вот пример с некоторыми комментариями, которые могут быть полезны. gaussian_kde хочет, чтобы данные и точки были сгруппированы по строкам, ie. (# ndim, # num values), согласно документации. В вашем случае вы должны row_stack([x, y, z]), чтобы форма была (3, 33000).

from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt

# simulate some data
n = 33000
x = np.random.randn(n)
y = np.random.randn(n) * 2

# data must be stacked as (# ndim, # n values) as per docs.
data = np.row_stack((x, y))

# perform KDE
kernel = gaussian_kde(data)

# create grid over which to evaluate KDE
s = np.linspace(-8, 8, 128)
grid = np.meshgrid(s, s)
# again KDE needs points to be row_stacked
grid_points = np.row_stack([g.ravel() for g in grid])

# evaluate KDE and reshape result correctly
Z = kernel(grid_points)
Z = Z.reshape(grid[0].shape)

# plot KDE as image and overlay some data points
fig, ax = plt.subplots()

ax.matshow(Z, extent=(s.min(), s.max(), s.min(), s.max()))
ax.plot(x[::10], y[::10], 'w.', ms=1, alpha=0.3)
ax.set_xlim(s.min(), s.max())
ax.set_ylim(s.min(), s.max())

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...