0

我对如何在 numpy 中准确地对 3D 数组进行切片和排序感到有些困惑。似乎有很多方法可以手动执行此操作,但我需要使用numpy.where(). 例如,如果lo360是 2D 经度值,则 2D 中的lat2d纬度值yi是经度值的一维数组,并且xi是纬度值的一维数组。

xiyi动态变化以表示一个小的地理区域,而lo360lat2d是类型为 (-90,90) 和 (0,360) 的行星的静态纬度和经度。xi与但形式相似,lo360yi降序而不是升序。因此,如果我有一个 3D 数组表示A(levels,lat,lon)并且我想提取一个区域:

slice2d = np.where( (lo360 <= xi.max()) &                                                    
                    (lo360 >= xi.min()) &                                                    
                    (lat2d <= yi.max()) &                                                    
                    (lat2d >= yi.min()) )
lon_old = lo360[slice2d]; print lon_old.shape
(441,)

当我想要一个 2D 切片时,这会返回一个 1D 数组。数据是正确的,所以这不是我的问题。

然后,当我尝试对 3D 数组进行切片时,A[i][slice2d]我得到一个不易动态验证的 1D 数组。我习惯griddata了 3D 数组xiyi分辨率,但我将yilat 更改为升序yi = yi[::-1]::

for i in np.arange(4):                                                          
    nvals[i] = matplotlib.mlab.griddata(lat_old,lon_old,                                     
                                            mvals[i][slice2d],                                   
                                            yi,xi)

这是我认为问题开始的地方,我需要结果有下降的纬度,所以我这样做是为了nvalsnvals = nvals[:,::-1,:]。但是数据全都搞砸了。我怀疑索引中存在一些错误,但是由于 python 没有返回错误,所以我正在对索引做一些事情,思考一件事,但得到另一件事。

也许你们中的一位专家可以发现一些奇怪的东西,或者提出更好的方法。当我弄清楚如何附加文件时,我会附上图像。

4

1 回答 1

2

看起来 griddata 返回的结果是转置的——它给出了沿列的 x 轴和沿行的 y 轴:

import numpy as np

#lats x lons
a2d=np.arange(20).reshape( (4,5) )
print a2d

lats=np.arange(4)
lats2d=np.ones(5)*lats[:,None]
yi=[1,3]
nlats=np.sum(np.bitwise_and(lats>=np.min(yi),lats<=np.max(yi)))

lons=np.arange(5)
lons2d=np.ones(4)[:,None]*lons
xi=[1,2]
nlons=np.sum(np.bitwise_and(lons>=np.min(xi),lons<=np.max(xi)))


#slice= lats2d>=1 & lats2d<=2 & lons2d>=1 & lons2d<=2
s1=np.bitwise_and(lats2d>=np.min(yi),lats2d<=np.max(yi))
s2=np.bitwise_and(lons2d>=np.min(xi),lons2d<=np.max(xi))
slice=np.bitwise_and(s1,s2)
print slice
slice=np.where(slice)
print a2d[slice].reshape( (nlats,nlons) )

import matplotlib.mlab as mlab

print mlab.griddata(lats2d[slice],lons2d[slice],a2d[slice],
#              np.array([1.3,2.1,2.9]),np.array([1.1,1.9]))
            np.array([1,2,3]),np.array([1,2]))
于 2012-09-07T14:42:55.307 回答