2015-08-24 138 views
0

這個問題是我之前遇到的輪廓數據點這裏。griddata輪廓處理時出現錯誤 - x的長度必須是z中的列數,而y的長度必須是行數

[ValueError: invalid shape for input data points in griddata operation

成功執行的GridData,是一個二維陣列,其所需的x和y爲1D和z後,我得到相對於輪廓模塊以下錯誤:

「類型錯誤:長度的x必須是z中的列數,並且y的長度必須是行數。「

對我來說,這在邏輯上是有意義的,因爲必須知道Z的X,Y位置才能輸入正確的數據。對於包含Z數據的點以外的所有其他位置,使用NaN製作正方形二維數組的缺點是,有沒有更優雅的解決方案?

我假設正在生成的griddata包含某種xy在索引基礎上爲z定位,但這可能不是這種情況,事實上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

我會在'coutour'之前的一個打印語句中檢查'xi,yi,zi'的形狀。更好的方法是在交互式shell中運行這個腳本,並在這個過程中的幾個地方查看變量。 – hpaulj

回答

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) 

zixiyi功能 - 第1和第2的尺寸

**這是10×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的工作示例,因此無法對其進行測試。

您需要打印所有這些陣列的形狀。否則,我們必須從經驗中推斷,或者運行我們自己的虛擬測試案例。我們不應該爲了幫助您調試代碼而去做所有這些工作。

+0

感謝您的指導。形狀函數是非常有用的,我已經設法糾正腳本。使用它,我發現z矩陣確實是1D而不是2D,正如你所建議的那樣。我將發佈固定代碼。 – Praxis

0

感謝您對調試numpy數組的所有幫助和建議。只是想爲此發佈工作代碼。最後,我使用ravel將Z減少到二維數組。如果沒有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() 
相關問題