如何使用网格从数据集中采样点?
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
进行插值。
r
、phi
和 intensity
都是 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)
我们得到:
所以我有一些数据,其中包含大约一百万个 (r, phi)
坐标,以及它们的强度。我想以网格模式对这些数据进行采样,这样我就可以减少内存使用,并更快地绘制。但是我想在 X、Y 中对数据进行采样,因为我会将坐标转换为 (X,Y)
坐标以绘制它们。
我在想我可以使用 meshgrid 来制作一个我想采样的模板,但我在下一步上遇到了困难。
我似乎无法在 google 或此处找到任何有用的搜索,但如果这个问题太简单,我深表歉意!
我正在使用 numpy,我的数据现在存储为三个单独的数组。我打算使用 np.meshgrid
和后来的 scipy.interpolate.griddata
进行插值。
r
、phi
和 intensity
都是 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)
我们得到: