【发布时间】:2019-07-31 21:19:20
【问题描述】:
我有以下最少代码使用scipy.interpolate.interp2d 对二维网格数据进行插值。
import numpy as np
from scipy import interpolate
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')
现在f这里可以用来评价其他点了。问题是我要评估的点是完全随机的点,没有形成规则的网格。
# Evaluate at point (x_new, y_new), in total 256*256 points
x_new = np.random.random(256*256)
y_new = np.random.random(256*256)
func(x_new, y_new)
这会导致我的PC出现运行时错误,好像把x_new和y_new当成mesh grid,生成一个65536x65536的求值矩阵,这不是我的目的。
RuntimeError: Cannot produce output of size 65536x65536 (size too large)
完成工作的一种方法是逐个评估点,使用代码:
z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])
但是,它慢!!!
%timeit z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])
1.26 s ± 46.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
是否有任何更快的方法来评估随机点?
这里更快,我的意思是与下面的时间相当:
x_new = np.random.random(256)
y_new = np.random.random(256)
%timeit f(x_new, y_new)
相同的 256*256 = 65536 次评估,在我的 PC 中进行此操作的时间:
1.21 ms ± 39.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
不一定要和1.21ms的速度相当,121ms完全可以接受。
【问题讨论】:
标签: python numpy scipy interpolation