从3D到2D阵列底图(Python)

时间:2016-10-13 08:57:43

标签: python arrays numpy

我正在尝试根据具有以下形状的lon / lat数组在地图(底图)上绘制数据:

lon (Ntracks, Npoints)
lat (Ntracks, Npoints)
data(Ntracks, Npoints, Ncycles)

问题在于,使用下面的代码,地图上没有显示任何内容(而且速度非常慢!甚至接近内存不足错误......)。我可能使用了错误的方法。我可以帮助您将此3D数据阵列转换为2D数据以使用pcolormesh功能吗?

map = Basemap(projection='mill',lat_ts=10,\
            llcrnrlon= -11.01472, \
            urcrnrlon=  2.769825, \
            llcrnrlat=  43.292, \
            urcrnrlat=  52.10833, \
            resolution='l')

# Zone
lonmin, lonmax = map.lonmin, map.lonmax
latmin, latmax = map.latmin, map.latmax       

# Missing value
misval = 99.999

# Masks on Lon/Lat arrays
lon = np.ma.masked_where(np.isnan(lon) == True, lon)
lat = np.ma.masked_where(np.isnan(lat) == True, lat)
lon = np.ma.masked_where(lon <= lonmin, lon)
lon = np.ma.masked_where(lon >= lonmax, lon)   
lat = np.ma.masked_where(lat <= latmin, lat)
lat = np.ma.masked_where(lat >= latmax, lat)

# Dimensions
Ntracks, Npoints, Ncycles = data.shape
'''
#-----------------
# TRACKS LOCATIONS 
# IT WORKS => SEE FIGURE POSTED BELOW
#-----------------
for track in range(Ntracks): 
  x, y = map( *np.meshgrid( lon[track,:], lat[track,:] ))
  y = y.T
  map.plot(x, y, marker= 'o',    \
               markersize=1.5, \
               color='#0B610B',
               markeredgecolor='#0B610B')

'''
#-----------------
# TRACKS DATA 
# => NOT WORKING !!
#-----------------
Data = np.full( (Npoints*Npoints), misval )

for track in range(Ntracks): 
  x, y = map( *np.meshgrid( lon[track,:], lat[track,:] ))
  y = y.T
  for c in range(Ncycles):
    Data[0:Npoints] = data[track,:,c]

    Data = np.ma.masked_where(np.isnan(Data) == True, Data)
    Data = np.ma.masked_where(Data >= misval, Data)

    Data = Data.reshape( (Npoints, Npoints) )

    # plot Data on the map
    map.pcolormesh(x, y, Data)


parallels = np.arange( latmin, latmax, 2., dtype= 'int')
meridians = np.arange( lonmin, lonmax, 2., dtype= 'int')

map.drawcoastlines(linewidth=1.5, color='white')
map.drawcountries(linewidth=1.5, color='grey')
map.drawparallels(parallels, labels= [1,0,0,0], color= 'black',   fontsize=16, linewidth=0)
map.drawmeridians(meridians, labels= [0,0,0,1], color= 'black', fontsize= 16, linewidth=0)
map.drawmapboundary(color='k',linewidth=2.0)
map.fillcontinents(color='#cdc5bf')

此代码不会产生错误,但地图上没有数据显示...
下面是代码在Ntracks = 1和Ncycles = 4的输出中返回的示例:

FILE 0 TRACK 011
CYCLE 1
[[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
 [-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
 [-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
 ..., 
 [-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
 [-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
 [-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]]
CYCLE 2
[[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
 [-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
 [-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
 ..., 
 [-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
 [-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
 [-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]]
CYCLE 3
[[-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 ..., 
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]]
CYCLE 4
[[-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 ..., 
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]
 [-- -- -- ..., 0.0 0.0 0.0]]

我应该有这样的事情(做一个接近0°lon的治疗) Tracks locations

1 个答案:

答案 0 :(得分:0)

这张地图似乎是一个非常好的工具,谢谢你提示:)

如果我做对了,Data应该是一个2D-Array,其中包含每个x-y对的值? 但是你只填充数据的第一个Npoints条目,然后你只是重塑它 - 所以除了第一个Npoints x Npoints矩阵之外,你没有在任何行中写任何东西。这可能不是你想要的,你想把第i个点填充到矩阵的[i,i]元素中。

因此,使用Data = np.full((Npoints, Npoints), np.nan)创建矩阵,而不是创建长度为N * N的1D矩阵。 然后np.fill_diagonal(Data, data[track, :, c])

我不确定你是否就在那里:

  

如果latlon关键字设置为True,则x,y表示为经度和   纬度(以度为单位)。 [...]

这不是你想要的吗?