Python 匹配x和y网格值的z值网格

Python 匹配x和y网格值的z值网格,python,arrays,numpy,Python,Arrays,Numpy,编辑:原始问题有缺陷,但出于透明的原因,我将其留在这里。 原件: 我有一些x,y,z数据,其中x和y是二维网格的坐标,z是对应于(x,y)的标量值 使用xx,yy=np.meshgrid(x,y)我可以得到两个网格,其中包含对应于每个网格位置的x和y值 >>> xx, yy = np.meshgrid(x, y) >>> print xx [[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5] [ 0.

编辑:原始问题有缺陷,但出于透明的原因,我将其留在这里。

原件: 我有一些x,y,z数据,其中x和y是二维网格的坐标,z是对应于(x,y)的标量值

使用
xx,yy=np.meshgrid(x,y)
我可以得到两个网格,其中包含对应于每个网格位置的x和y值

>>> xx, yy = np.meshgrid(x, y)
>>> print xx
[[ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]]
>>> print yy
[[ 1.   1.   1.   1.   1.   1.   1.   1.   1.   1. ]
 [ 1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1]
 [ 1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2]
 [ 1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3]
 [ 1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4]
 [ 1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5]
 [ 1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6]
 [ 1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7]
 [ 1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8]
 [ 1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9]]
>>> xx, yy= np.meshgrid(np.unique(x), np.unique(y))
>>> print xx
 [[ 1.4  1.6  1.8  2. ]
 [ 1.4  1.6  1.8  2. ]
 [ 1.4  1.6  1.8  2. ]]
>>> print yy
[[ 0.2  0.2  0.2  0.2]
 [ 0.3  0.3  0.3  0.3]
 [ 0.4  0.4  0.4  0.4]]
现在我想要一个z形状相同的数组,其中网格值对应于原始数据中匹配的x和y值!但是,我找不到一个优雅的、内置的解决方案,在这个解决方案中,我不需要对数据重新进行网格化,我想我对应该如何处理它缺乏一些理解

我尝试了以下解决方案(使用我的真实数据,不是这个简单的示例数据,但它应该有相同的结果),但我的最终网格没有完全填充。 请帮忙

更正问题:

正如评论人士指出的那样,我最初的虚拟数据不适合我提出的问题。以下是问题的改进版本:

我有一些x,y,z数据,其中x和y是二维网格的坐标,z是对应于(x,y)的标量值。从文本文件“data.txt”读取数据:

加载文本:

>>> import numpy as np
>>> inFile = 'C:\data.txt' 
>>> x, y, z = np.loadtxt(inFile, unpack=True, usecols=(0, 1, 2), comments='#', dtype=float)
>>> print x
[ 1.4  1.4  1.4  1.6  1.6  1.6  1.8  1.8  1.8  2.   2.   2. ]
>>> print y
[ 0.2  0.3  0.4  0.2  0.3  0.4  0.2  0.3  0.4  0.2  0.3  0.4]
>>> print z
[ 1.93164167  1.88377898  1.81946453  1.95967788  1.9118152   1.84750074
  1.90890971  1.86104702  1.79673256  1.78735231  1.73948962  1.67517517]
使用
xx,yy=np.meshgrid(np.unique(x),np.unique(y))
我可以得到两个包含对应于每个网格位置的x和y值的网格

>>> xx, yy = np.meshgrid(x, y)
>>> print xx
[[ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]
 [ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5]]
>>> print yy
[[ 1.   1.   1.   1.   1.   1.   1.   1.   1.   1. ]
 [ 1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1  1.1]
 [ 1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2  1.2]
 [ 1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3]
 [ 1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4  1.4]
 [ 1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5]
 [ 1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6  1.6]
 [ 1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7  1.7]
 [ 1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8  1.8]
 [ 1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9  1.9]]
>>> xx, yy= np.meshgrid(np.unique(x), np.unique(y))
>>> print xx
 [[ 1.4  1.6  1.8  2. ]
 [ 1.4  1.6  1.8  2. ]
 [ 1.4  1.6  1.8  2. ]]
>>> print yy
[[ 0.2  0.2  0.2  0.2]
 [ 0.3  0.3  0.3  0.3]
 [ 0.4  0.4  0.4  0.4]]
现在,xx和yy中的每个对应单元位置都对应于一个原始网格点位置。 我只需要一个等效数组,其中网格值对应于原始数据中匹配的z值

"""e.g. 
[[ 1.93164166734  1.9596778849  1.90890970517  1.78735230743]
 [ 1.88377897779  1.91181519535  1.86104701562  1.73948961789]
 [ 1.81946452501  1.84750074257  1.79673256284  1.67517516511]]"""
但是,我找不到一个优雅的、内置的解决方案,在这个解决方案中,我不需要对数据重新进行网格化,我想我对应该如何处理它缺乏一些理解。例如,使用
xx,yy,zz=np.meshgrid(x,y,z)
返回我认为无法使用的三个3D数组

请帮忙

编辑: 得益于Jaime的解决方案,我成功地实现了这个示例:

但是引导我走上这条道路的代码(带有真实的输入数据)仍然失败。我现在发现了问题。在生成zz之前,我一直在使用
scipy.ndimage.zoom
将网格数据重新采样到更高的分辨率

>>> import scipy.ndimage
>>> zoom = 2
>>> x =  scipy.ndimage.zoom(x, zoom)
>>> y =  scipy.ndimage.zoom(y, zoom)
>>> z =  scipy.ndimage.zoom(z, zoom)
这产生了一个包含许多nan条目的数组:

array([[ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan],
       ..., 
       [ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan]])
当我跳过缩放阶段时,将生成正确的阵列:

array([[-22365.93400183, -22092.31794674, -22074.21420168, ...,
        -14513.89091599, -12311.97437017, -12088.07062786],
       [-29264.34039242, -28775.79743097, -29021.31886353, ...,
        -21354.6799064 , -21150.76555669, -21046.41225097],
       [-39792.93758344, -39253.50249278, -38859.2562673 , ...,
        -24253.36838785, -25714.71895023, -29237.74277727],
       ..., 
       [ 44829.24733543,  44779.37084337,  44770.32987311, ...,
         21041.42652441,  20777.00408692,  20512.58162671],
       [ 44067.26616067,  44054.5398901 ,  44007.62587598, ...,
         21415.90416488,  21151.48168444,  20887.05918082],
       [ 43265.35371973,  43332.5983711 ,  43332.21743471, ...,
         21780.32283309,  21529.39770759,  21278.47255848]])

Write-exact必须是给定样本数据的预期输出,您能将其添加到问题中吗?我认为您想要的只是
z=np.sin(xx)**2+np.cos(yy)**2
。因为
xx
yy
是二维的,
z
也将是二维的。如果您试图在不创建二维数组的情况下实现这一点,请使用广播:
z=np.sin(x)**2+np.cos(y.reformate(-1,1))**2
@WarrenWeckesser感谢您的建议,但这仅在z数据实际上是从方程计算出来的情况下才有效。“我的z数据是从xyz文本文件中获取的,因此在本例中,它已经在一维数组中。@feedMe,那么您所要求的没有实际意义-如果
x
y
(ny,nx)
二维网格的唯一列和行值,那么必须至少有
nx*ny
z
-值。您的示例
z
-值实际上不是在常规二维网格上采样的,因此如果不进行某种插值,就无法从这些值生成“完全填充”的网格。@WarrenWeckesser是的,我意识到我的问题有缺陷,正在编辑。。。很抱歉
array([[-22365.93400183, -22092.31794674, -22074.21420168, ...,
        -14513.89091599, -12311.97437017, -12088.07062786],
       [-29264.34039242, -28775.79743097, -29021.31886353, ...,
        -21354.6799064 , -21150.76555669, -21046.41225097],
       [-39792.93758344, -39253.50249278, -38859.2562673 , ...,
        -24253.36838785, -25714.71895023, -29237.74277727],
       ..., 
       [ 44829.24733543,  44779.37084337,  44770.32987311, ...,
         21041.42652441,  20777.00408692,  20512.58162671],
       [ 44067.26616067,  44054.5398901 ,  44007.62587598, ...,
         21415.90416488,  21151.48168444,  20887.05918082],
       [ 43265.35371973,  43332.5983711 ,  43332.21743471, ...,
         21780.32283309,  21529.39770759,  21278.47255848]])