python - Scipy 在结构化二维数据上进行插值,但在非结构化点进行评估?
问题描述
我有以下最小代码scipy.interpolate.interp2d
用于对 2d 网格数据进行插值。
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当成网格,生成一个评估矩阵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 是完全可以接受的。
解决方案
您正在寻找的功能是scipy.interpolate.RegularGridInterpolator
给定一组点 (x,y,z),其中 x 和 y 在规则网格上定义,它允许您对中间 (x,y) 点的 z 值进行采样。在您的情况下,这将如下所示
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)
def f(x,y):
return np.sin(x**2+y**2)
z = f(*np.meshgrid(x, y, indexing='ij', sparse=True))
func = interpolate.RegularGridInterpolator((x,y), z)
x_new = np.random.random(256*256)
y_new = np.random.random(256*256)
xy_new = list(zip(x_new,y_new))
z_new = func(xy_new)func(xy_new)
有关更多详细信息,请参阅https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolate.RegularGridInterpolator.html
推荐阅读
- node.js - 安装离子时的npm ERR
- python - 如何根据某些条件迭代 Pandas DataFrame 以创建新的 DateFrame
- javascript - 获取插入日期的次数以了解 Node.js 中的最后一次 for 循环迭代
- sql - 通过两个时间戳从多个表中获取数据
- flutter - 飞镖/颤振中的表情符号和重音编码
- java - 线程“JavaFX 应用程序线程”中的异常 java.util.IllegalFormatConversionException: f != java.lang.Integer
- php - wp_query 的条件 meta_query 和 tax_query
- wordpress - http 子页面未重定向到 https(安全)页面 - 如何修复?
- java - 给定一个字符串,确定字符串的排列是否可以形成回文
- javascript - 在 Shiny 中需要使用 updateRadioGroupButtons 动态更新下拉选项