gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:27:19 25 4
gpt4 key购买 nike

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

我想我可以使用网格来提出我想要采样的模板,但我被困在下一步。

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

我正在使用 numpy,我的数据现在存储为三个单独的数组。我打算使用 np.meshgrid及以后 scipy.interpolate.griddata用于插值。
r , phiintensity都是np.array s 与形状 (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='.')
情节给出:
enter image description here
现在添加任意强度值:
intensity=np.sqrt(x**2+y**2)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, intensity)
散点图给出:
enter image description here
如果我理解得很好,我们应该离你的起点不远。我们现在有 3 个包含 1000 个值的数组。我们将把它减少到一个 20x20 的 mesgrid。
我们必须首先创建 x 和 y 箱,然后从 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 图给出:
enter image description here
正如您在评论中所要求的那样,我们现在可以回到原来的 x,y,z 数组结构。
首先,我们必须计算bins的中心坐标
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)
我们获得 :
enter image description here

关于python - 如何使用网格从数据集中采样点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62448275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com