网格数据轮廓绘制期间出错 - x 的长度必须是 z 中的列数,y 的长度必须是行数
Error during contouring of griddata - Length of x must be number of columns in z, and length of y must be number of rows
这个问题是我之前遇到的关于等高线数据点问题的后续问题,这里有详细说明。
[
成功执行 griddata 后,需要 x 和 y 作为 1D 和 z 作为二维数组,我得到以下与轮廓模块相关的错误:
"TypeError: Length of x must be number of columns in z, and length of y must be number of rows."
这在逻辑上对我来说是有意义的,因为必须知道 Z 的 X、Y 位置才能输入正确的数据。除了为包含 Z 数据的点以外的所有位置制作一个带有 NaN 的方形二维数组,是否有更优雅的解决方案?
我假设正在生成的网格数据在索引基础上包含某种针对 z 的 xy 定位,但情况可能并非如此,事实上可能需要在数组中精确指定 xy 位置。这对我来说似乎加倍了,我认为 griddata 模块可以处理。
如果有人能阐明从网格数据绘制轮廓的正确过程,那将很有帮助。
一如既往,感谢您的宝贵时间和协助。
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
import numpy.ma as ma
from numpy.random import uniform, seed
from numpy import genfromtxt
my_data = genfromtxt('WaterTable.csv', delimiter=',')
# Data imported as a 2D array
z = my_data[1:,2:3]
#Data imported as 1D array
x = my_data[1:, 0]
y = my_data[1:, 1]
xmax = max(x)
xmin = min(x)
ymax = max(y)
ymin = min(y)
# Prepares for import to griddata
xi = np.linspace(xmin, xmax, 2000)
yi = np.linspace(ymin, ymax, 2000)
# grids data
zi = griddata((x, y), z, (xi, yi), method='cubic')
# contour the gridded data
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.title('griddata test (%d points)' % npts)
plt.show()
抛出错误:
Traceback (most recent call last):
File "C:/Users/Hp/PycharmProjects/GISdev/Irregular_Grid04.py", line 30, in <module>
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2188, in contour
ret = ax.contour(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7316, in contour
return mcontour.QuadContourSet(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1106, in __init__
ContourSet.__init__(self, ax, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 700, in __init__
self._process_args(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1119, in _process_args
x, y, z = self._contour_args(args, kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1166, in _contour_args
x,y,z = self._check_xyz(args[:3], kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1208, in _check_xyz
"and length of y must be number of rows.")
TypeError: Length of x must be number of columns in z, and length of y must be number of rows.
重读你的问题我意识到 gridata
正在为每个 (xi,yi)
对计算一个 zi
值,即 2000
。但这些值只是线性的。 - 由 linspace
生成。要contour
他们需要组成笛卡尔space。这就是我的例子所做的。您的 xi
、yi
值在传递给 gridata
.
之前需要经过 meshgrid
(或等效)
我的轮廓示例是有效的,但我对你的形状有什么问题的猜测是错误的。问题出在 gridata
之前,而不是
之后
调试 numpy
代码的一个基本步骤是在不同点打印数组的形状,尤其是当错误谈到它们的长度时。另一种是在交互式shell中构建简单的测试用例(我使用Ipython)。
让我们试试轮廓步骤:
In [32]: xi=np.arange(10)
In [33]: yi=np.arange(15)
In [34]: zi=xi[:,None]+yi[None,:]
In [35]: zi.shape
Out[35]: (10, 15)
zi
是 xi
和 yi
的函数 - 第一维和第二维
** 那是 10 x 15,而不仅仅是 10 或 15 **
In [36]: plt.contour(xi,yi,zi)
....
TypeError: Length of x must be number of columns in z,
and length of y must be number of rows.
这是你的错误信息吗?
再试一次,但使用 zi
:
的转置
In [37]: plt.contour(xi,yi,zi.T)
Out[37]: <matplotlib.contour.QuadContourSet instance at 0xa32726c>
有效。 plt.contour(yi,xi,zi)
也是如此;和 plt.contour(zi)
(当然轴标签是错误的)。
如果不进行所有设置将在 griddata
中运行的 my_data
的工作,我怀疑 xi
和 yi
(. T) 会解决问题。
但是!你对两者都使用 linspace(...,2000)
,所以也许它们具有相同的长度并且 zi
是正方形。
另一种可能是z
的形状不对。我猜 x
和 y
是 (n,)
,而 z
是 (n,1)
(由于 2:3)。那是如何通过 griddata
到 zi
的呢?我没有 griddata
的工作示例,因此无法对其进行测试。
您需要打印所有这些数组的形状。否则我们必须从经验中推断,或者 运行 我们自己的虚拟测试用例。我们不必做所有这些工作来帮助您调试代码。
感谢您提供有关调试 numpy 数组的所有帮助和建议。只是想 post 为此编写工作代码。最后我使用 ravel 将 Z 简化为二维数组。没有 ravel Zi returns 形状 (2000, 2000, 1) 而不是 (2000, 2000)。拉威尔删除了问题所在的额外维度。我想通过meshgrid可能会有类似的效果。
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
from numpy import genfromtxt
my_data = genfromtxt('WaterTable.csv', delimiter=',')
# Data imported as a 2D array
z = my_data[1:,2:3]
#Data imported as 1D array
x = my_data[1:, 0]
y = my_data[1:, 1]
xmax = max(x)
xmin = min(x)
ymax = max(y)
ymin = min(y)
# Prepares for import to griddata
xi = np.linspace(xmin, xmax, 2000)
yi = np.linspace(ymin, ymax, 2000)
# grids data
zi = griddata((x, y), z.ravel(), (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data
print(zi.shape)
print(xi.shape)
print(yi.shape)
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()
这个问题是我之前遇到的关于等高线数据点问题的后续问题,这里有详细说明。
[
成功执行 griddata 后,需要 x 和 y 作为 1D 和 z 作为二维数组,我得到以下与轮廓模块相关的错误:
"TypeError: Length of x must be number of columns in z, and length of y must be number of rows."
这在逻辑上对我来说是有意义的,因为必须知道 Z 的 X、Y 位置才能输入正确的数据。除了为包含 Z 数据的点以外的所有位置制作一个带有 NaN 的方形二维数组,是否有更优雅的解决方案?
我假设正在生成的网格数据在索引基础上包含某种针对 z 的 xy 定位,但情况可能并非如此,事实上可能需要在数组中精确指定 xy 位置。这对我来说似乎加倍了,我认为 griddata 模块可以处理。
如果有人能阐明从网格数据绘制轮廓的正确过程,那将很有帮助。
一如既往,感谢您的宝贵时间和协助。
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
import numpy.ma as ma
from numpy.random import uniform, seed
from numpy import genfromtxt
my_data = genfromtxt('WaterTable.csv', delimiter=',')
# Data imported as a 2D array
z = my_data[1:,2:3]
#Data imported as 1D array
x = my_data[1:, 0]
y = my_data[1:, 1]
xmax = max(x)
xmin = min(x)
ymax = max(y)
ymin = min(y)
# Prepares for import to griddata
xi = np.linspace(xmin, xmax, 2000)
yi = np.linspace(ymin, ymax, 2000)
# grids data
zi = griddata((x, y), z, (xi, yi), method='cubic')
# contour the gridded data
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.title('griddata test (%d points)' % npts)
plt.show()
抛出错误:
Traceback (most recent call last):
File "C:/Users/Hp/PycharmProjects/GISdev/Irregular_Grid04.py", line 30, in <module>
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2188, in contour
ret = ax.contour(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 7316, in contour
return mcontour.QuadContourSet(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1106, in __init__
ContourSet.__init__(self, ax, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 700, in __init__
self._process_args(*args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1119, in _process_args
x, y, z = self._contour_args(args, kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1166, in _contour_args
x,y,z = self._check_xyz(args[:3], kwargs)
File "C:\Python27\lib\site-packages\matplotlib\contour.py", line 1208, in _check_xyz
"and length of y must be number of rows.")
TypeError: Length of x must be number of columns in z, and length of y must be number of rows.
重读你的问题我意识到 gridata
正在为每个 (xi,yi)
对计算一个 zi
值,即 2000
。但这些值只是线性的。 - 由 linspace
生成。要contour
他们需要组成笛卡尔space。这就是我的例子所做的。您的 xi
、yi
值在传递给 gridata
.
meshgrid
(或等效)
我的轮廓示例是有效的,但我对你的形状有什么问题的猜测是错误的。问题出在 gridata
之前,而不是
调试 numpy
代码的一个基本步骤是在不同点打印数组的形状,尤其是当错误谈到它们的长度时。另一种是在交互式shell中构建简单的测试用例(我使用Ipython)。
让我们试试轮廓步骤:
In [32]: xi=np.arange(10)
In [33]: yi=np.arange(15)
In [34]: zi=xi[:,None]+yi[None,:]
In [35]: zi.shape
Out[35]: (10, 15)
zi
是 xi
和 yi
的函数 - 第一维和第二维
** 那是 10 x 15,而不仅仅是 10 或 15 **
In [36]: plt.contour(xi,yi,zi)
....
TypeError: Length of x must be number of columns in z,
and length of y must be number of rows.
这是你的错误信息吗?
再试一次,但使用 zi
:
In [37]: plt.contour(xi,yi,zi.T)
Out[37]: <matplotlib.contour.QuadContourSet instance at 0xa32726c>
有效。 plt.contour(yi,xi,zi)
也是如此;和 plt.contour(zi)
(当然轴标签是错误的)。
如果不进行所有设置将在 griddata
中运行的 my_data
的工作,我怀疑 xi
和 yi
(. T) 会解决问题。
但是!你对两者都使用 linspace(...,2000)
,所以也许它们具有相同的长度并且 zi
是正方形。
另一种可能是z
的形状不对。我猜 x
和 y
是 (n,)
,而 z
是 (n,1)
(由于 2:3)。那是如何通过 griddata
到 zi
的呢?我没有 griddata
的工作示例,因此无法对其进行测试。
您需要打印所有这些数组的形状。否则我们必须从经验中推断,或者 运行 我们自己的虚拟测试用例。我们不必做所有这些工作来帮助您调试代码。
感谢您提供有关调试 numpy 数组的所有帮助和建议。只是想 post 为此编写工作代码。最后我使用 ravel 将 Z 简化为二维数组。没有 ravel Zi returns 形状 (2000, 2000, 1) 而不是 (2000, 2000)。拉威尔删除了问题所在的额外维度。我想通过meshgrid可能会有类似的效果。
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
from numpy import genfromtxt
my_data = genfromtxt('WaterTable.csv', delimiter=',')
# Data imported as a 2D array
z = my_data[1:,2:3]
#Data imported as 1D array
x = my_data[1:, 0]
y = my_data[1:, 1]
xmax = max(x)
xmin = min(x)
ymax = max(y)
ymin = min(y)
# Prepares for import to griddata
xi = np.linspace(xmin, xmax, 2000)
yi = np.linspace(ymin, ymax, 2000)
# grids data
zi = griddata((x, y), z.ravel(), (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data
print(zi.shape)
print(xi.shape)
print(yi.shape)
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()