这个问题是我之前在问题数据点上遇到的问题的后续问题。
[ValueError: invalid shape for input data points in griddata operation
成功执行griddata后,需要x和y为1D,z为2D数组,我得到与轮廓模块有关的以下错误:
" TypeError:x的长度必须是z中的列数,y的长度必须是行数。"
这在逻辑上对我有意义,因为必须知道Z的X,Y位置才能输入正确的数据。如果没有为包含Z数据的点以外的所有位置制作带NaN的正方形2D阵列,是否有更优雅的解决方案?
我认为生成的griddata在索引的基础上包含某种xy定位,但是情况可能并非如此,实际上xy位置可能需要在数组中精确指定。这似乎是我加倍的,我认为griddata模块会处理这个问题。
如果有人能够从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.
答案 0 :(得分:1)
重读您的问题我意识到gridata
正在为每个zi
对计算一个(xi,yi)
值,即2000
。但这些价值只是线性的。 - 由linspace
生成。要contour
他们需要形成一个笛卡尔空间。这就是我的榜样。在传递给xi
之前,您的yi
,meshgrid
值需要通过gridata
(或等效值)。
我的轮廓示例是有效的,但我对你的形状有什么问题的猜测是关闭的。问题出在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
的函数 - 第1和第2维
**那是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)
(当然轴标签是错误的)。
如果不进行设置my_data
griddata
的所有工作,我怀疑xi
和yi
(.T)的切换会解决问题。
但是!您对两者使用linspace(...,2000)
,因此它们可能具有相同的长度,zi
是正方形。
另一种可能性是z
形状错误。我猜x
和y
为(n,)
,z
为(n,1)
(由于2:3)。这是如何通过griddata
到zi
的?我没有griddata
的工作示例,因此无法对其进行测试。
您需要打印所有这些数组的形状。否则我们必须从经验中推断,或运行我们自己的虚拟测试用例。我们不应该去完成所有工作来帮助您调试代码。
答案 1 :(得分:0)
感谢您提供有关调试numpy数组的所有帮助和建议。只是想为此发布工作代码。最后,我使用ravel将Z减少为2D数组。没有ravel Zi返回(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()