我对如何在numpy中精确切片和排序3D数组感到困惑。
似乎有很多方法可以手动执行此操作,但我需要使用numpy.where()
执行此操作。例如,如果lo360
是2D经度值,2D lat2d
纬度值,yi
是经度值的1D数组,xi
是纬度值的1D数组。
xi
和yi
动态更改以表示较小的地理区域,而lo360
和lat2d
是该行星的静态纬度和经度(-90,90) )和(0,360)。与xi
类似的lo360
yi
但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,)
的3D数组,我想提取一个区域:
A[i][slice2d]
当我想要2D切片时,这会返回一维数组。数据是正确的,所以这不是我的问题。
然后,当我尝试切片3D数组griddata
时,我得到一个不易动态验证的一维数组。我使用xi
将3D数组转换为yi
和yi
分辨率,但我将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没有返回任何错误,所以我正在做一些索引思考一件事而不是另一件事。
也许你们中的一位专家可以发现一些棘手的事情,或者建议一个更好的方法。当我弄清楚如何附加文件时,我会附上图片。
答案 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]))