妥协scipy.interpolate.Rbf以及scipy.interpolate.griddata?

2024-05-19 02:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要生成一个2D密度图,给定一些非结构化的(x, y)坐标,以及一个z值,作为分配给每个点的权重。在

我可以使用scipy.interpolate.Rbfscipy.interpolate.griddata将值插值到网格中(参见下面的代码)。第一种方法非常准确,但速度很慢,而第二种方法速度更快,但明显不够准确。在

请参见下图,其中Rfb位于左侧,griddata位于右侧:

enter image description here

这两个功能之间有什么折衷的办法吗?会产生与Rfb函数更相似的结果,但其速度与griddata函数的速度更相似?在

# Data
N = 1000
x, y, z = np.random.uniform(0.0005, 0.03, N),\
    np.random.uniform(6., 10., N), np.random.uniform(1., 10., N)
xmin, xmax, ymin, ymax = min(x), max(x), min(y), max(y)

# Set up a regular grid of interpolation points
xi, yi = np.linspace(xmin, xmax, 200), np.linspace(ymin, ymax, 200)
xi, yi = np.meshgrid(xi, yi)
# Normalize data and grid.
x_new, xi_new = (x - xmin) / (xmax - xmin), (xi - xmin) / (xmax - xmin)
y_new, yi_new = (y - ymin) / (ymax - ymin), (yi - ymin) / (ymax - ymin)

# Interpolate new data with Rbf.    
s = time.clock()
rbf = scipy.interpolate.Rbf(x_new, y_new, z, function='linear')
zi = rbf(xi_new, yi_new)
print(time.clock() - s)
# Plot density map.
ax1 = plt.subplot(121)
plt.pcolormesh(xi, yi, zi, cmap=plt.get_cmap('GnBu_r'), zorder=2)
plt.contour(xi, yi, zi, 2, colors='#551a8b', linewidths=0.5, zorder=3)

# Interpolate new data with griddata.    
s = time.clock()
# Python 2.7
vals = zip(*[x_new, y_new])
# Python 3.6
# vals = np.array([x_new, y_new]).T
zi = scipy.interpolate.griddata(vals, z, (xi_new, yi_new), method='linear')
print(time.clock() - s)
# Plot density map.
ax2 = plt.subplot(122)
plt.imshow(
    zi, extent=(xmin, xmax, ymin, ymax), origin='lower',
    cmap=plt.get_cmap('GnBu_r'))
plt.contour(xi, yi, zi, 2, colors='#551a8b', linewidths=0.5, zorder=3)

plt.show()

Tags: newtimenppltscipy速度xminymax

热门问题