Skip to main content
 首页 » 编程设计

python之在 map 上绘制电流数据 : Too many value to unpack error

2024年11月01日31daizhj

这是我的代码:

from netCDF4 import * 
import datetime as dt 
import numpy as np 
import numpy.ma as ma 
from datetime import date, datetime, timedelta 
import matplotlib.pyplot as plt 
 
nc=Dataset('datasets/essai.nc') 
 
time_var = nc.variables[str('forecast_time0')] 
wave_var = nc.variables['DIST_GDS0_SFC'] 
lat = nc.variables['g0_lat_1'][:] 
lon = nc.variables['g0_lon_2'][:] 
uin = nc.variables['UOGRD_GDS0_DBSL'][:] 
vin = nc.variables['VOGRD_GDS0_DBSL'][:] 
plt.quiver(lon[::5], lat[::5], uin[::5], vin[::5], scale=200) 

这是我得到的错误:

Traceback (most recent call last): 
  File "nctry.py", line 37, in <module> 
    plt.quiver(lon[::5], lat[::5], uin[::5], vin[::5], scale=200) 
  File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2877, in quive 
r 
    ret = ax.quiver(*args, **kw) 
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 6627, in quiver 
    q = mquiver.Quiver(self, *args, **kw) 
  File "C:\Python27\lib\site-packages\matplotlib\quiver.py", line 394, in __init 
__ 
    X, Y, U, V, C = _parse_args(*args) 
  File "C:\Python27\lib\site-packages\matplotlib\quiver.py", line 356, in _parse 
_args 
    nr, nc = U.shape 
ValueError: too many values to unpack 

我认为问题出在 UOGRD 和 VOGRD 上,它们有很多值但不知道如何操纵它?

这是 uogrd 的样子:

forecast_time 高达 4。

好的,所以我使用了 np.array 和形状函数,这就是我得到的:

C:\Python27>python nctry.py (321,) //lat (720,) //lon (4, 321, 720) //uogrd (4, 321, 720) //vogrd

然后我尝试了这段代码:

但它只显示一个箭头。你能告诉我为什么吗?

所以现在我有一些看起来像这样的模型:

但是对于 [0, :, :], 1, 2 or 3.. 这个图像没有改变.. 怎么了? 此外,所有的箭头都指向同一个方向,当我们谈论洋流的海洋时,情况并非如此。我使用 deg2rad 函数。 最后,我无法想象海岸线,这正常吗? 谢谢

请您参考如下方法:

问题是 UOGRD(可能还有 VOGRD)包含太多维度。您需要通过切片来减少维数。但是,鉴于目前的信息,我无法指示您删除哪个维度。

但是,您应该将 lat、lon、UOGRD 和 VOGRD 转换为 np。 array 使用命令打印出每个数组的形状

UOGRD = np.array(UOGRD) 
print UOGRD.shape 

对所有 4 个阵列执行此操作。这将打印出元组 (d1_length, d2_length, ..., dn_length)。

如果我们知道 lat=N 和 lon=M 的维数,我们应该希望 UOGRD 的维数类似于(N, M, x, y, z) 我们可以切掉不需要的维度。

编辑:

从你的形状函数,它告诉我们 uin 和 vin 都是 3 维的。您可以看到 len(lat) = 321、len(lon) = 720 以及 uin 和 vin 具有尺寸 (x, 321, 720)。这意味着我们要绘制 uin 和 vin 的最后两个维度。因此,试试这个

uin = nc.variables['UOGRD_GDSO_DBSL'] 
uin = np.array(uin) 
uin = uin[0, :, :] 
vin = nc.variables['vOGRD_GDSO_DBSL'] 
vin = np.array(vin) 
vin = vin[0, :, :] 

不要执行 uin = uin.shape,因为那样会设置 uin = (4, 321, 720) 而不是您的数据。唯一的问题是,我们必须弄清楚应该在切片中放入哪个索引。尝试 [0,:,:] 然后 [1,:,:] ... [3,:,:]。