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

Python 如何使用网格从数据集中采样点?,python,interpolation,sampling,Python,Interpolation,Sampling,所以我有一些数据,大约有一百万个(r,phi)坐标,以及它们的强度。我想以网格模式对这些数据进行采样,这样可以减少所用内存,并加快绘图速度。但是,我想在X,Y中采样数据,因为我将把坐标转换为(X,Y)坐标来绘制它们 我在想我可以用一个网格来制作一个我想做的模板,但是我被困在了下一步 我在谷歌或这里似乎找不到任何有用的搜索,但如果这是一个太简单的问题,我深表歉意 我正在使用numpy,我的数据现在存储为三个独立的数组。我计划使用np.meshgrid和后来的scipy.interpolate.gr

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

我在想我可以用一个网格来制作一个我想做的模板,但是我被困在了下一步

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

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

r
phi
intensity
都是
np。数组
s的形状
(百万,)

e、 g

我从这个开始

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,θ任意值创建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)
图中给出:

现在添加任意强度值:

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容器,然后从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)
然后我们可以得到未屏蔽的值(参见上面的解释)

我们可以检查新尺寸:

print(znew.shape)
仅给出235个值(而不是1000):

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xnew, ynew, znew)
我们获得:


您有一个Python标记,您是否将Python与Pandas或类似的框架一起使用?你能在你的问题中添加更多的细节和你迄今为止使用过的数据结构和/或代码的示例吗?谢谢,这真的很有用!有没有一种方法可以使最终产品更加通用?据我所知,这只能用pcolor绘制。是否有方法将其转换为“法线”坐标,即3列数组([X Y Z])?对不起,如果这是显而易见的!我对答案进行了编辑,以包括从网格开始的X Y Z阵列的计算。
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xnew, ynew, znew)