我有一个看起来像图A的表面,想象这是顶视图。表面计算了Z值。
现在我需要在新点中找到所有Z值,如图B.如何做到这一点?我尝试了scipy.interpolate.interp2d
,但它给出了一些奇怪的结果:
我只是想在"图"中找到自定义x和自定义x。
Mimimal代码示例
func_int = scipy.interpolate.interp2d([point[0] for point in pointsbottom],[point[1] for point in pointsbottom],[point[2] for point in pointsbottom], kind = 'linear')
pointscaption = map(lambda point:(point[0],point[1],func_int(point[0],point[1])),pointscaption)
其中pointsbottom
是(x,y,z)列表,pointscaption
是(x,y,z)列表,但我需要找到新的z。
答案 0 :(得分:1)
请尝试使用griddata:
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
不同之处在于griddata期望常规数据作为输入(嗯...,我认为)。并不是说你应该有不同的结果,而是你能更快地发现问题。你可以掩盖"常规网格"数据很容易。
我的第一个猜测是那些输入坐标不是你期望的那样(可能与你正在计算的功能有不同的比例),但没有测试就很难说。
在任何情况下,你似乎都想要一个表面,根据定义,它是一种网格数据,因此使用这个不同的框架来发现问题应该相当容易。
编辑(关于海报怀疑的进一步考虑):让我们说你想要一些你想在里面输入一些数据的对象。完成此操作后,您希望能够使用该数据估算任何位置。为此,您可以构建一个这样的类:
import numpy as np
class Estimation():
def __init__(self,datax,datay,dataz):
self.x = datax
self.y = datay
self.v = dataz
def estimate(self,x,y,using='ISD'):
"""
Estimate point at coordinate x,y based on the input data for this
class.
"""
if using == 'ISD':
return self._isd(x,y)
def _isd(self,x,y):
d = np.sqrt((x-self.x)**2+(y-self.y)**2)
if d.min() > 0:
v = np.sum(self.v*(1/d**2)/np.sum(1/d**2))
return v
else:
return self.v[d.argmin()]
此示例使用反向平方距离方法,该方法对于估计非常稳定(如果避免除以零)。它不会很快但我希望它是可以理解的。从这一点开始,您可以通过以下方式估算2D空间中的任何点:
e = Estimation(datax,datay,dataz)
newZ = e.estimate(30,55) # the 30 and 55 are just example coordinates
如果您要对整个网格执行此操作:
datax,datay = np.random.randint(0,100,10),np.random.randint(0,100,10)
dataz = datax/datay
e = Estimation(datax,datay,dataz)
surf = np.zeros((100,100))
for i in range(100):
for j in range(100):
surf[i,j] = e.estimate(i,j)
您将获得一个可以使用的图像,例如,matplotlib(其中颜色代表表面的高度):
import matplotlib.pyplot as plt
plt.imshow(surf.T,origin='lower',interpolation='nearest')
plt.scatter(datax,datay,c=dataz,s=90)
plt.show()
这个实验的结果如下:
如果您不想使用ISD(反向平方距离),只需在Estimation类上实现一个新方法。这是你在找什么?