Xarrayの次元、座標、スライシング

xarrayには次元と座標があります。次元は緯度、経度、水深、時刻などで座標の名称あり、次元のサイズが整数で規定されます。座標は次元と関連づけられた配列で、緯度の座標は、30, 31, 32…などの具体的な緯度の値をもちます。

座標には、次元座標非次元座標の二つがあります。次元座標は次元の名称をもつ特別な座標で、次元のサイズをもつ1次元の配列です。DatasetやDataArrayを表示させたときに「*」が付加されたり、太字により表示されたりし、他の座標とは区別されます。

非次元座標は1次元である必要はなく、1次元から多次元(例えば緯度と経度に対応する値をもつ2次元の座標など)です。

注意すべき事はselを用いたスライシングは次元座標に対してのみしかできないことです。

例をあげます。

ds0=xr.Dataset()
nt=3;ny=2;nx=2
ary=np.zeros((nt,ny,nx))
time =[dt.datetime(2000,1,1),dt.datetime(2000,1,2),dt.datetime(2000,1,3)]
time2=[dt.datetime(2010,1,1),dt.datetime(2010,1,2),dt.datetime(2010,1,3)]
lat=[-45.0,45.0]
lon=[90.0,270.0]

idx=np.arange(nt*ny*nx).reshape(nt,ny,nx)

for m in range(nt):
    ary[m,:,:]=np.random.rand(4).reshape(ny,nx)
da0=xr.DataArray(ary,dims=["time","lat","lon"],\
                 coords={"time":time,"lat":lat,"lon":lon})
da1=xr.DataArray(idx,dims=["time","lat","lon"])
da2=xr.DataArray(time2,dims=["time"])

ds0["val"]=da0
ds0["idx"]=da1
ds0["time2"]=da2
ds0=ds0.set_coords("idx")
ds0=ds0.set_coords("time2")

上記のxarrayを考えた時に、次元と同じ名称をもつtime、lat、lonは、次元座標です。一方でidxとtime2はset_coodsにより座標になりますが、次元の名称はもたない非次元座標です。このとき、time、lat、lonに対してはselメソッドが使えますが、idxとtime2に対しては使えません。

idxは作図するときに座標軸として使うことができるという点で利点があります。例えば、

ds0.plot.scatter(x="idx",y="val")

とすると、3次元の配列であるvalの変数を1次元に展開して作図することができます。

また、

ds1=ds0.set_index(time="time2")

とすると、time2の値をtimeの値とすることができて、次元座標の値を入れ替えることができます。この時、ds1にはtimeの次元座標しか残らず、time2の値はtimeの値としてのこりますが、time2の座標は消滅します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA