如何使用网格从数据集中采样点?

How to sample points from a data set using a grid?

所以我有一些数据,其中包含大约一百万个 (r, phi) 坐标,以及它们的强度。我想以网格模式对这些数据进行采样,这样我就可以减少内存使用,并更快地绘制。但是我想在 X、Y 中对数据进行采样,因为我会将坐标转换为 (X,Y) 坐标以绘制它们。

我在想我可以使用 meshgrid 来制作一个我想采样的模板,但我在下一步上遇到了困难。

我似乎无法在 google 或此处找到任何有用的搜索,但如果这个问题太简单,我深表歉意!

我正在使用 numpy,我的数据现在存储为三个单独的数组。我打算使用 np.meshgrid 和后来的 scipy.interpolate.griddata 进行插值。

rphiintensity 都是 np.array,形状为 (million,)

例如

r = array([1560.8, 1560.8003119, 1560.8006238, ..., 3556.831746,
           3558.815873 , 3560.8      ])

我是从这个开始的;

r = data[:, 0]  # radius
phi = data[:, 1]  # altitude angle
h2o = data[:, 2]  # intensity

x = r * np.sin(phi)  # It's a left handed coordinate system
z = r * np.cos(phi)

对于采样网格,我有这个;

Xscale = np.linspace(min(x), max(x), 1000)
Zscale = np.linspace(min(z), max(z), 1000)

[X, Z] = np.meshgrid(Xscale, Zscale)

如果你能提供一些数据来处理就更好了。 没关系,我们会创造一些。

让我们从 r,theta 任意值创建 x,y 值:

import numpy as np
import matplotlib.pyplot as plt

theta=np.linspace(0.,50.,1000)
r=np.linspace(5.,10,1000)

x=r*np.sin(theta)
y=r*np.cos(theta)

plt.plot(x,y,linestyle='',marker='.')

情节给出:

现在添加任意强度值:

intensity=np.sqrt(x**2+y**2)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, intensity)

散点图给出:

如果我理解的很好,我们应该离你的起点不远了。我们现在有 3 个具有 1000 个值的数组。我们将把它缩小到 20x20 网格。 我们必须首先创建 x 和 y bin,然后从 scipy 调用 binned_statistic_2d 方法,就是这样。

import scipy.stats as stats

binx=np.linspace(-10.,10.,20)
biny=np.linspace(-10.,10.,20)

ret = stats.binned_statistic_2d(x, y, intensity, 'mean', bins=[binx,biny])

Z=ret.statistic
Z = np.ma.masked_invalid(Z) # allow to mask Nan values got in bins where there is no value
X, Y = np.meshgrid(binx,biny)

plt.pcolor(X,Y,Z)
plt.show()

pcolor 图给出:

根据您评论中的要求,我们现在可以返回到原始的 x、y、z 数组结构。

首先,我们要计算箱子的中心坐标

binx_centers=(binx[1:] + binx[:-1])/2
biny_centers=(biny[1:] + biny[:-1])/2
Xcenters, Ycenters = np.meshgrid(binx_centers,biny_centers)

然后我们可以得到未屏蔽的值(见上面的解释)

xnew=np.ma.masked_array(Xcenters, Z.mask).compressed()
ynew=np.ma.masked_array(Ycenters, Z.mask).compressed()
znew=Z.compressed()

我们可以检查新尺寸:

print(znew.shape)

仅给出 235 个值(而不是 1000 个。):

(235L,) 

以及具有压缩值的新散点图:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xnew, ynew, znew)

我们得到: