【问题标题】:How to sample points from a data set using a grid?如何使用网格从数据集中采样点?
【发布时间】:2020-06-18 10:51:24
【问题描述】:

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

我在想我可以使用网格来设计一个我想采样的模板,但我被困在下一步了。

我似乎在谷歌或这里找不到任何有用的搜索,但如果这个问题太简单了,我们深表歉意!

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

rphiintensity 都是np.arrays,形状为(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)

【问题讨论】:

  • 你有一个 Python 标签,你是在使用 Python 和 Pandas 之类的框架或类似的框架吗?您能否在您的问题中添加更多详细信息以及您迄今为止使用的数据结构和/或代码示例?

标签: python interpolation sampling


【解决方案1】:

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

让我们从 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 bins,然后从 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)

我们得到:

【讨论】:

  • 谢谢,这真的很有用!有没有办法做到这一点,从而产生更通用的最终产品?据我所知,这只能使用 pcolor 绘制。有没有办法将其转换为“正常”坐标,即 3 列数组([ X Y Z])?很抱歉,如果这很明显!
  • 我已经编辑了答案以包括从网格网格开始的 X Y Z 数组的计算。
猜你喜欢
  • 2020-02-17
  • 2018-06-18
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2017-03-17
  • 2013-06-15
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多