动态3d数组切片和排序

时间:2012-09-07 08:12:03

标签: python numpy matplotlib scipy scientific-computing

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

xiyi动态更改以表示较小的地理区域,而lo360lat2d是该行星的静态纬度和经度(-90,90) )和(0,360)。与xi类似的lo360 yiA(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,) 的3D数组,我想提取一个区域:

A[i][slice2d]

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

然后,当我尝试切片3D数组griddata时,我得到一个不易动态验证的一维数组。我使用xi将3D数组转换为yiyi分辨率,但我将yi = yi[::-1] lat更改为升序:for i in np.arange(4): nvals[i] = matplotlib.mlab.griddata(lat_old,lon_old, mvals[i][slice2d], yi,xi)

nvals

以下是我认为问题开始的地方,我需要将结果降级,所以我这样做nvals = nvals[:,::-1,:]:{{1}}。但数据全都搞砸了。我怀疑索引中有一些错误,但是因为python没有返回任何错误,所以我正在做一些索引思考一件事而不是另一件事。

也许你们中的一位专家可以发现一些棘手的事情,或者建议一个更好的方法。当我弄清楚如何附加文件时,我会附上图片。

1 个答案:

答案 0 :(得分: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]))
相关问题