[Xarray] 1. 數(shù)據(jù)結(jié)構(gòu)

Xarray的數(shù)據(jù)結(jié)構(gòu)

參考Xarray官方文檔谷浅,Python氣象數(shù)據(jù)處理進(jìn)階之Xarray(1):Xarray的數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)

在Xarray中栽烂,數(shù)據(jù)是由結(jié)構(gòu)和標(biāo)簽的,分為以下幾種:

1.DataArray:

帶有標(biāo)注或命名維度的多維數(shù)組。DataArray將metadata(例如:維名稱,坐標(biāo)和屬性)添加到基礎(chǔ)的未標(biāo)記的數(shù)據(jù)結(jié)構(gòu)分扎,例如numpy和Dask數(shù)組阅茶。

2.Datasets:

具有類似字典結(jié)構(gòu)的尺寸對其的DataArray對象的集合。因此术荤,可以在單個(gè)DataArray的維度上執(zhí)行的大多數(shù)操作都可以在Dataset上執(zhí)行。

Dataset是多個(gè)DataArray的集合

3.Variable:

類似于NetCDF的變量每篷。由dimensions瓣戚,data和attributes組成。variable和numpy數(shù)組之間的主要功能區(qū)別在于焦读,對variable的數(shù)字運(yùn)算可以通過維名稱實(shí)現(xiàn)數(shù)組廣播子库。

通俗的講,variables < DataArray < Dataset (<指包含于)矗晃。這種解釋不完全正確仑嗅,但是初學(xué)者可以這樣理解。

Xarray中的數(shù)據(jù)結(jié)構(gòu)如何被識別和標(biāo)記

Xarray通過對維命名的操作實(shí)現(xiàn)數(shù)據(jù)篩選和處理喧兄,實(shí)現(xiàn)數(shù)據(jù)的標(biāo)記和命名通過以下幾個(gè)定義實(shí)現(xiàn):

*Dimension: 每一軸的維名稱(e.g.,('x','y','z'))无畔。

*Coordinate: 坐標(biāo)或刻度。類似于字典的序列吠冤,將每個(gè)點(diǎn)標(biāo)記浑彰。比如說dimension是緯度,那么對應(yīng)的coordinate就是緯度坐標(biāo)(90°N拯辙,89°N郭变,88°N……89°S,90°S)涯保。

*Index: 索引號诉濒,也可以說是位置標(biāo)號。a[0]代表a數(shù)組的一個(gè)數(shù)夕春,0就是index未荒。


#CN05.1格點(diǎn)資料

f = xr.open_dataset('CN05.1_Tmax_1961_2017_daily_05x05.nc')

print(f)

#<xarray.Dataset>

#Dimensions: (latitude: 82, longitude: 142, time: 20574)

#Coordinates:

# * longitude (longitude) float64 69.75 70.25 70.75 71.25 ... 139.2 139.8 140.2

# * latitude (latitude) float64 14.75 15.25 15.75 16.25 ... 54.25 54.75 55.25

# * time (time) datetime64[ns] 1961-01-01 1961-01-02 ... 2017-04-30

#Data variables:

# tmax (time, latitude, longitude) float32 ...

#Attributes:

# CDI: Climate Data Interface version 1.6.5rc3 (http://code.zmaw.d...

# Conventions: CF-1.4

# history: Thu Aug 23 09:34:52 2018: cdo -r remapcon,grid05x05 daily/0...

# CDO: Climate Data Operators version 1.6.5rc3 (http://code.zmaw.d...

可以看到,該文件是一個(gè)Datasets及志,里面含有變量:Data Variables片排,數(shù)據(jù)集的維度有經(jīng)度緯度和時(shí)間,各自有各自的坐標(biāo)Coordinates速侈,同樣數(shù)據(jù)集還有一些屬性來表明數(shù)據(jù)集信息率寡。

我們可以通過:


print(f.variables)

print(f.dims)

print(f.coords)

來分別查看數(shù)據(jù)集中包含的變量,維倚搬,坐標(biāo)冶共。

再比如NCEP的位勢高度資料:


f = xr.open_dataset('hgt.1948.nc')

print(f)

#<xarray.Dataset>

#Dimensions: (lat: 73, level: 17, lon: 144, time: 366)

#Coordinates:

# * level (level) float32 1000.0 925.0 850.0 700.0 ... 50.0 30.0 20.0 10.0

# * lat (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0

# * lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5

# * time (time) datetime64[ns] 1948-01-01 1948-01-02 ... 1948-12-31

#Data variables:

# hgt (time, level, lat, lon) float32 ...

#Attributes:

# Conventions: COARDS

# title: mean daily NMC Reanalysis (1948)

# description: Data is from NMC initialized reanalysis\n(4x/day). It co...

# platform: Model

# history: created 99/05/11 by Hoop (netCDF2.3)

# References: (http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reana...

# dataset_title: NCEP-NCAR Reanalysis 1

基本同上。

需要說明的是,ncl數(shù)據(jù)中存在short格式捅僵,在讀取時(shí)需要使用short2flt()函數(shù)家卖,但是在Python中不存在short格式,默認(rèn)均為float庙楚,無需考慮這一點(diǎn)篡九。

如何創(chuàng)建一個(gè)DataArray

有時(shí)我們通過其他手段讀取了相關(guān)數(shù)據(jù),但是數(shù)據(jù)是np.array格式的醋奠,我們需要將其轉(zhuǎn)換為DataArray,亦或我們需要輸出一個(gè)NC文件伊佃,需要將計(jì)算后的數(shù)組轉(zhuǎn)為DataArray格式窜司,這就用到了創(chuàng)建的方法。

創(chuàng)建一個(gè)DataArray需要什么航揉?

1.Data: 數(shù)據(jù)塞祈,可以是numpy ndarray刁卜,series试伙,DataFrame,pandas.panel等格式

2.coords: 坐標(biāo)列表或字典

如果是列表县匠,則應(yīng)為元組列表媳友。其中第一個(gè)元素為dimension name斯议,第二個(gè)元素是對應(yīng)的坐標(biāo)array_like對象。

用字典格式比較好

3.dims: 維名稱列表

如果省略醇锚,并且coords是元組列表哼御,則維度名稱取自coords。

4.attrs: 屬性

5.names: 變量名

以上焊唬,除了data外恋昼,都不是必須的。

創(chuàng)建示例如下:


data = np.array([[1,2,3],[4,5,6]])

level = ['500', '850', '1000']

times = pd.date_range('2000-01-01', periods=2)

foo = xr.DataArray(data, coords=[times, level], dims=['time', 'level'])

print(foo)

#<xarray.DataArray (time: 2, level: 3)>

#array([[1, 2, 3],

# [4, 5, 6]])

#Coordinates:

# * time (time) datetime64[ns] 2000-01-01 2000-01-02

# * level (level) <U4 '500' '850' '1000'

上面提到赶促,除了data以外液肌,其他都是不必要的


foo = xr.DataArray(data)

print(foo)

#<xarray.DataArray (dim_0: 2, dim_1: 3)>

#array([[1, 2, 3],

# [4, 5, 6]])

#Dimensions without coordinates: dim_0, dim_1

如果是從一個(gè)DataFrame數(shù)據(jù)轉(zhuǎn)化為DataArray的話(這種操作通常是為了將Pandas和Xarray聯(lián)合使用):


df = pd.DataFrame({'x': [0, 1], 'y': [2, 3]}, index=['a', 'b'])

df.index.name = 'abc'

df.columns.name = 'xyz'

print(df)

#xyz x y

#abc

#a 0 2

#b 1 3

print(xr.DataArray(df))

#<xarray.DataArray (abc: 2, xyz: 2)>

#array([[0, 2],

# [1, 3]])

#Coordinates:

# * abc (abc) object 'a' 'b'

# * xyz (xyz) object 'x' 'y'

會自動識別行列的名稱和序號。

官方文檔還有更復(fù)雜的例子鸥滨,需要的話再去官網(wǎng)查看嗦哆。

在創(chuàng)建了數(shù)據(jù)之后,我們同樣可以使用相關(guān)的操作獲取DataArray的各種信息:


a = foo.values

a = foo.dims

a = foo.coords

a = foo.attrs

如果想對DataArray的值修改可以通過以下兩種方法:


foo.values = foo.values+1

foo = foo+1

兩種結(jié)果是等價(jià)的爵赵,但官方只給出了第一種方法吝秕。

  • 通過指令foo.attrs['units'] = 'meters'賦予屬性信息,比如給一個(gè)單位空幻、備注等等烁峭。

  • 通過指令foo.name = 'hgt'賦予名稱信息。

*通過指令foo.rename('temperature')改名,比如通過hgt計(jì)算得到了一個(gè)新變量约郁,需要改名缩挑,就可以用這個(gè)指令。

在得到一個(gè)DataArray后鬓梅,用于畫圖時(shí)供置,比如我們需要獲取它的經(jīng)度和緯度(在這里,剛剛的例子是時(shí)間和高度)绽快,那么可以直接通過


foo.coords['time']

foo['time']

這兩種方式取出坐標(biāo)信息芥丧。

要修改或者刪除某坐標(biāo)信息的話,原理和修改數(shù)據(jù)是一樣的:


foo['time'] = pd.date_range('1999-01-02',periods = 2)

del foo['time']

如何創(chuàng)建一個(gè)Dataset

官網(wǎng)給出一個(gè)以氣候數(shù)據(jù)為例的Dataset結(jié)構(gòu):

image

<center>

display: inline-block;

color: #999;

padding: 2px;">Dataset數(shù)據(jù)結(jié)構(gòu)

</center>

一個(gè)數(shù)據(jù)集坊罢,包含了數(shù)據(jù)主體(Temperature,Precipitation)续担,維度坐標(biāo)(latitude,longitude)。

根據(jù)官網(wǎng)的例子活孩,一個(gè)Dataset是這樣創(chuàng)建的物遇,實(shí)際上與DataArray類似:


temp = 15 + 8 * np.random.randn(2, 2, 3)

precip = 10 * np.random.rand(2, 2, 3)

lon = [[-99.83, -99.32], [-99.79, -99.23]]

lat = [[42.25, 42.21], [42.63, 42.59]]

ds = xr.Dataset({'temperature': (['x', 'y', 'time'], temp),

'precipitation': (['x', 'y', 'time'], precip)},

coords={'lon': (['x', 'y'], lon),

'lat': (['x', 'y'], lat),

'time': pd.date_range('2014-09-06', periods=3),

'reference_time': pd.Timestamp('2014-09-05')})

#<xarray.Dataset>

#Dimensions: (time: 3, x: 2, y: 2)

#Coordinates:

# lon (x, y) float64 -99.83 -99.32 -99.79 -99.23

# lat (x, y) float64 42.25 42.21 42.63 42.59

# * time (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08

# reference_time datetime64[ns] 2014-09-05

#Dimensions without coordinates: x, y

#Data variables:

# temperature (x, y, time) float64 15.09 7.656 20.82 ... 2.477 10.53 17.56

# precipitation (x, y, time) float64 3.444 2.694 6.921 ... 7.351 2.099 5.972

實(shí)際上這個(gè)例子與我們通常接觸的不太一樣,因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)的lat和lon都是一維的憾儒。

對Dataset的操作和DataArray基本一致询兴,不再重復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末起趾,一起剝皮案震驚了整個(gè)濱河市诗舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌训裆,老刑警劉巖始衅,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缭保,居然都是意外死亡汛闸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門艺骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诸老,“玉大人,你說我怎么就攤上這事钳恕”鸱” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵忧额,是天一觀的道長厘肮。 經(jīng)常有香客問我,道長睦番,這世上最難降的妖魔是什么类茂? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任耍属,我火速辦了婚禮,結(jié)果婚禮上巩检,老公的妹妹穿的比我還像新娘厚骗。我一直安慰自己,他們只是感情好兢哭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布领舰。 她就那樣靜靜地躺著,像睡著了一般迟螺。 火紅的嫁衣襯著肌膚如雪冲秽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天矩父,我揣著相機(jī)與錄音劳跃,去河邊找鬼。 笑死浙垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郑诺。 我是一名探鬼主播夹姥,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辙诞!你這毒婦竟也來了辙售?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤飞涂,失蹤者是張志新(化名)和其女友劉穎旦部,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體较店,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡士八,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梁呈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婚度。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖官卡,靈堂內(nèi)的尸體忽然破棺而出蝗茁,到底是詐尸還是另有隱情,我是刑警寧澤寻咒,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布哮翘,位于F島的核電站,受9級特大地震影響毛秘,放射性物質(zhì)發(fā)生泄漏饭寺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佩研。 院中可真熱鬧柑肴,春花似錦、人聲如沸旬薯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊序。三九已至硕舆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骤公,已是汗流浹背抚官。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阶捆,地道東北人凌节。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像洒试,于是被迫代替她去往敵國和親倍奢。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容