给定一些数据。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
x = [0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,]
y = [0.01,0.01,0.01,0.255,0.255,0.255,0.5,0.5,0.5,0.01,0.01,0.01,0.255,0.255,0.255,0.5,0.5,0.5,0.01,0.01,0.01,0.255,0.255,0.255,0.5,0.5,0.5,]
z = [0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2,0.,0.1,0.2]
v = [0.,0.,1.,0.,1.,1.,0.,1.,1.,0.,0.,0.,0.,0.5,1.,0.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.5,1.,]
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
c = ax.scatter(x, y, z, c = v, s = 100, cmap = plt.cm.bwr, edgecolor = "black", alpha = 0.2)
ax.scatter(0.51, 0.32, 0.12, s = 100, c = "black", edgecolor = "black")
plt.show()
我想获得一个函数f(x,y,z)
,以找出任意位置v
的值。很简单吧?那我为什么死活搞不定这个scipy问题呢?
我找到的示例定义了x、y、z,定义了某种漂亮的网格,并进行评估以获得正确形状和顺序的v
。这就是我的尝试失败的地方。如果所有数据最初都格式化为1D,怎么办?
我以为我可以这样做
V = zeros((len(x),len(y),len(z)))
for i in range(len(x)):
V[i, None, None] = v[i]
for j in range(len(y)):
V[None, j, None] = v[j]
for k in range(len(z)):
V[None, None, k] = v[k]
fn = RegularGridInterpolator((x,y,z), V)
但是这会返回 ValueError: 维度0中的点必须严格递增
__call__
进行了封装,使它更加方便携带,就像其他Scipy函数一样:class Interpolate3D(): def __init__(self, x, y, z, v): self.x = x self.y = y self.z = z self.v = v self.pts = np.array([self.x, self.y, self.z]).T def __call__(self, *args): return scipy.interpolate.griddata(self.pts, self.v, args, method="linear")
- komodovaran_