Python 匹配x和y网格值的z值网格
编辑:原始问题有缺陷,但出于透明的原因,我将其留在这里。 原件: 我有一些x,y,z数据,其中x和y是二维网格的坐标,z是对应于(x,y)的标量值 使用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.
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]])