0

numpyで3D配列を正確にスライスしてソートする方法について少し混乱しています。これを手動で行うには多くの方法があるようですが、私は を使用してこれを行う必要がありますnumpy.where()。たとえば、lo3602D 経度値の場合lat2d、2D の緯度値yiは経度値xiの 1D 配列であり、緯度値の 1D 配列です。

xiおよびyiは動的に変化して小さな地理的地域を表し、lo360およびlat2dはタイプ (-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解像度を使用していましたが、yi緯度を昇順に変更しました: yi = yi[::-1]:

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

ここで問題が始まると思います。結果に降順の緯度が必要なので、これをnvals:に行いnvals = nvals[:,::-1,:]ます。しかし、データはすべてめちゃくちゃです。インデックス作成に何らかのエラーがあると思われますが、python がエラーを返さなかったので、インデックス作成で何かを考えていますが、別のことを考えています。

おそらく、あなたの専門家の 1 人が、厄介な問題を発見したり、より良い方法を提案したりできるでしょう。ファイルの添付方法がわかったら画像を添付します。

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 に答える