簡體   English   中英

Scipy 對結構化二維數據進行插值,但在非結構化點進行評估?

[英]Scipy interpolate on structured 2d data, but evaluate at unstructured points?

我有以下最小代碼使用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)

這會在我的電腦中導致運行時錯誤,它似乎將 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 處於可比的速度,121 ms 是完全可以接受的。

您正在尋找的功能是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM