griddata轮廓加工期间出错 - x的长度必须是z中的列数,y的长度必须是行数

时间:2015-08-24 01:23:52

标签: numpy scipy contour

这个问题是我之前在问题数据点上遇到的问题的后续问题。

[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.

2 个答案:

答案 0 :(得分:1)

重读您的问题我意识到gridata正在为每个zi对计算一个(xi,yi)值,即2000。但这些价值只是线性的。 - 由linspace生成。要contour他们需要形成一个笛卡尔空间。这就是我的榜样。在传递给xi之前,您的yimeshgrid值需要通过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)

zixiyi的函数 - 第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的所有工作,我怀疑xiyi(.T)的切换会解决问题。

但是!您对两者使用linspace(...,2000),因此它们可能具有相同的长度,zi是正方形。

另一种可能性是z形状错误。我猜xy(n,)z(n,1)(由于2:3)。这是如何通过griddatazi的?我没有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()