Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何在曲面离散3D点(x,y,z)之后从给定的x,y获得z值_Python_Matplotlib - Fatal编程技术网

Python-如何在曲面离散3D点(x,y,z)之后从给定的x,y获得z值

Python-如何在曲面离散3D点(x,y,z)之后从给定的x,y获得z值,python,matplotlib,Python,Matplotlib,我是Python的新手。我使用块代码从离散的3D点绘制曲面,如下所示: #!/usr/bin/python3 import sys import matplotlib import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D from scipy import array,

我是Python的新手。我使用块代码从离散的3D点绘制曲面,如下所示:

#!/usr/bin/python3

import sys
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from scipy import array, newaxis

DATA = array([
    [-0.807237702464, 0.904373229492, 111.428744443],
    [-0.802470821517, 0.832159465335, 98.572957317],
    [-0.801052795982, 0.744231916692, 86.485869328],
    [-0.802505546206, 0.642324228721, 75.279804677],
    [-0.804158144115, 0.52882485495, 65.112895758],
    [-0.806418040943, 0.405733109371, 56.1627277595],
    [-0.808515314192, 0.275100227689, 48.508994388],
    [-0.809879521648, 0.139140394575, 42.1027499025],
    [-0.810645106092, -7.48279012695e-06, 36.8668106345],
    [-0.810676720161, -0.139773175337, 32.714580273],
    [-0.811308686707, -0.277276065449, 29.5977405865],
    [-0.812331692291, -0.40975978382, 27.6210856615],
    [-0.816075037319, -0.535615685086, 27.2420699235],
    [-0.823691366944, -0.654350489595, 29.1823292975],
    [-0.836688691603, -0.765630198427, 34.2275056775],
    [-0.854984518665, -0.86845932028, 43.029581434],
    [-0.879261949054, -0.961799684483, 55.9594146815],
    [-0.740499820944, 0.901631050387, 97.0261463995],
    [-0.735011699497, 0.82881933383, 84.971061395],
    [-0.733021568161, 0.740454485354, 73.733621269],
    [-0.732821755233, 0.638770044767, 63.3815970475],
    [-0.733876941678, 0.525818698874, 54.0655910105],
    [-0.735055978521, 0.403303715698, 45.90859502],
    [-0.736448900325, 0.273425879041, 38.935709456],
    [-0.737556181137, 0.13826504904, 33.096106049],
    [-0.738278724065, -9.73058423274e-06, 28.359664343],
    [-0.738507612286, -0.138781586244, 24.627237837],
    [-0.738539663773, -0.275090412979, 21.857410904],
    [-0.739099040189, -0.406068448513, 20.1110519655],
    [-0.741152200369, -0.529726022182, 19.7019157715],
])

Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)

ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))

fig.tight_layout()
plt.show()
现在我想从任意的X和Y得到Z值,比如Z=f(X,Y),但我不知道怎么做。 任何人都有办法帮助我


非常感谢。

这是一个简单的numpy数组比较和索引问题。对于给定的一对
x,y

xy = numpy.array([-0.802470821517, 0.832159465335])
我们可以使用

numpy.isclose(DATA[:, :2], xy)
# array([[False, False],
#        [ True,  True],
#        [False, False],
#        ....
#        [False, False],
#        [False, False]])
这将为每行提供两个布尔值,一个用于
x
,另一个用于
y
。我们只对两个都是
True
的行感兴趣,所以

numpy.all(numpy.isclose(DATA[:, :2], xy), axis=1)
# array([False,  True, False, ..., False, False, False, False])
然后,我们可以使用结果再次索引
数据
,并像这样提取
z

DATA[numpy.all(numpy.isclose(DATA[:, :2], xy), axis=1), -1]
# array([98.57295732])

如果要将此点阵列转换为具有输入x、y和输出z的连续的函数,则需要使用模型对其进行描述。模型允许点的插值

我假设这个点数组描述了一个曲面图,但是绘制它是不必要的

曲面图如下所示(我只能提供链接):

曲面图中的每个四边形由4个点定义,表示平面的一部分。因此,一个描述数组的函数应该是组成曲面图的所有不同平面的分段函数

一个平面需要3个点来定义它,因此创建一个函数来遍历数组,依次选择3个点,找到平面的方程,然后将其添加到方程数组中

计算公式的代码给出了3点:

def equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3):    
    a1 = x2 - x1 
    b1 = y2 - y1 
    c1 = z2 - z1 
    a2 = x3 - x1 
    b2 = y3 - y1 
    c2 = z3 - z1 
    a = b1 * c2 - b2 * c1 
    b = a2 * c1 - a1 * c2 
    c = a1 * b2 - b1 * a2 
    d = (- a * x1 - b * y1 - c * z1) 
    print "equation of plane is ", 
    print a, "x +", 
    print b, "y +", 
    print c, "z +", 
    print d, "= 0."

然后,对于给定的x和y,找出哪个平面包含这些x和y点(使用类似于nils-werners答案的代码),得到相应的方程,并使用该函数获得z坐标

你的观点独特吗?换言之,曲面/函数是否保证不具有具有相同X和Y组合的两个不同的Z坐标?是否要获取精确点处的
Z
值,还是要获取最近邻
Z
值?感谢Nils的回答。然而,如果我想得到给定的一对(x=-0.8,y=-0.5)的z值,那么您的解决方案不起作用。在对离散的3D点进行线性化之后,我想得到给定数据中不同(x,y)对的z值。你还有别的解决办法吗?谢谢。
-0.8,-0.5
不存在于您的
x,y
值中,您希望得到什么?