{ "cells": [ { "cell_type": "markdown", "id": "68b32414", "metadata": {}, "source": [ "# 5. 手動創建DataArray\n", "\n", "從讀取netCDF檔案的過程中,我們已經理解DataArray的架構,也就是將資料儲存在座標軸的框架中,其中大氣科學資料的儲存格式大多是(time, level, lat, lon)這樣四維的結構。當然,也不一定要是這四個軸,只要是給定了座標軸,我們就可以手動建立DataArray。\n", "\n", "> *class* xarray.DataArray(data=``, coords=None, dims=None, name=None, attrs=None) \n", "\n", "- data - Values for this array. Must be an numpy.ndarray, ndarray like, or castable to an ndarray.\n", "- dims – Name(s) of the data dimension(s).\n", "- coords – Coordinates (tick labels) to use for indexing along each dimension. The following notations are accepted:\n", " - mapping {dimension name: array-like}\n", " - mapping {coord name: DataArray} \n", " - mapping {coord name: Variable}\n", "- name – Name of this array.\n", "- attrs – Attributes to assign to the new instance.\n", "\n", "**Example 1: 將每日OLR資料轉化成(year, pentad, lat, lon)格式:** 在探討季內尺度的季內變異時,將資料轉換成pentad單位是很方便的做法,可以過濾掉太高頻天氣尺度的變化。\n", "\n", "先準備資料:" ] }, { "cell_type": "code", "execution_count": 1, "id": "61adcb00", "metadata": {}, "outputs": [], "source": [ "import xarray as xr \n", "\n", "olr_ds = xr.open_dataset(\"data/olr.nc\") \n", "olr_da = olr_ds.olr\n", "olr_noleap = olr_da.sel(time=~((olr_da.time.dt.month == 2) & (olr_da.time.dt.day == 29))) # 因為處理pentad資料,2/29會使該候多一天,\n", " # 為方便計算先拿掉2/29。\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "602b1334", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (year: 20, pentad: 73, lat: 90, lon: 360)>\n",
       "array([[[[219.89698792, 219.15559387, 218.40510559, ..., 225.50248718,\n",
       "          223.55485535, 223.65061951],\n",
       "         [223.34541321, 224.53091431, 222.86465454, ..., 227.65988159,\n",
       "          226.38674927, 224.60290527],\n",
       "         [227.29621887, 226.65647888, 226.98161316, ..., 229.71142578,\n",
       "          229.39892578, 228.51731873],\n",
       "         ...,\n",
       "         [211.89347839, 212.39381409, 216.15280151, ..., 217.59571838,\n",
       "          214.77052307, 212.65678406],\n",
       "         [212.62583923, 212.52403259, 216.57559204, ..., 221.01184082,\n",
       "          215.40840149, 211.68217468],\n",
       "         [213.66184998, 212.31236267, 213.03718567, ..., 222.91699219,\n",
       "          218.48425293, 216.92329407]],\n",
       "\n",
       "        [[224.29585266, 222.79246521, 222.32139587, ..., 226.94450378,\n",
       "          225.85778809, 225.28334045],\n",
       "         [228.91574097, 228.96260071, 227.50735474, ..., 232.39346313,\n",
       "          231.34643555, 229.98277283],\n",
       "         [233.0683136 , 231.8346405 , 231.92663574, ..., 236.21047974,\n",
       "          236.50788879, 235.31025696],\n",
       "...\n",
       "         [214.0785675 , 214.45594788, 218.28843689, ..., 218.18579102,\n",
       "          214.91642761, 215.7442627 ],\n",
       "         [212.68942261, 212.64877319, 215.43222046, ..., 211.55192566,\n",
       "          211.44346619, 209.45568848],\n",
       "         [210.72885132, 210.49061584, 210.29870605, ..., 214.1131897 ,\n",
       "          210.98692322, 208.78648376]],\n",
       "\n",
       "        [[214.6018219 , 215.97660828, 215.11463928, ..., 215.63418579,\n",
       "          215.11351013, 215.05775452],\n",
       "         [217.36659241, 217.99145508, 217.28042603, ..., 217.16047668,\n",
       "          217.06045532, 216.31282043],\n",
       "         [220.6197052 , 221.49935913, 221.74649048, ..., 219.66426086,\n",
       "          219.0226593 , 218.87825012],\n",
       "         ...,\n",
       "         [205.20707703, 208.00669861, 212.51377869, ..., 205.86964417,\n",
       "          203.92337036, 205.05079651],\n",
       "         [202.4234314 , 204.04801941, 207.63363647, ..., 198.36546326,\n",
       "          197.54985046, 198.2558136 ],\n",
       "         [198.34162903, 196.90713501, 197.9355011 , ..., 202.5773468 ,\n",
       "          199.10409546, 198.11695862]]]])\n",
       "Coordinates:\n",
       "  * year     (year) int64 1998 1999 2000 2001 2002 ... 2013 2014 2015 2016 2017\n",
       "  * pentad   (pentad) int64 1 2 3 4 5 6 7 8 9 10 ... 65 66 67 68 69 70 71 72 73\n",
       "  * lat      (lat) float32 -44.5 -43.5 -42.5 -41.5 -40.5 ... 41.5 42.5 43.5 44.5\n",
       "  * lon      (lon) float32 0.5 1.5 2.5 3.5 4.5 ... 355.5 356.5 357.5 358.5 359.5
" ], "text/plain": [ "\n", "array([[[[219.89698792, 219.15559387, 218.40510559, ..., 225.50248718,\n", " 223.55485535, 223.65061951],\n", " [223.34541321, 224.53091431, 222.86465454, ..., 227.65988159,\n", " 226.38674927, 224.60290527],\n", " [227.29621887, 226.65647888, 226.98161316, ..., 229.71142578,\n", " 229.39892578, 228.51731873],\n", " ...,\n", " [211.89347839, 212.39381409, 216.15280151, ..., 217.59571838,\n", " 214.77052307, 212.65678406],\n", " [212.62583923, 212.52403259, 216.57559204, ..., 221.01184082,\n", " 215.40840149, 211.68217468],\n", " [213.66184998, 212.31236267, 213.03718567, ..., 222.91699219,\n", " 218.48425293, 216.92329407]],\n", "\n", " [[224.29585266, 222.79246521, 222.32139587, ..., 226.94450378,\n", " 225.85778809, 225.28334045],\n", " [228.91574097, 228.96260071, 227.50735474, ..., 232.39346313,\n", " 231.34643555, 229.98277283],\n", " [233.0683136 , 231.8346405 , 231.92663574, ..., 236.21047974,\n", " 236.50788879, 235.31025696],\n", "...\n", " [214.0785675 , 214.45594788, 218.28843689, ..., 218.18579102,\n", " 214.91642761, 215.7442627 ],\n", " [212.68942261, 212.64877319, 215.43222046, ..., 211.55192566,\n", " 211.44346619, 209.45568848],\n", " [210.72885132, 210.49061584, 210.29870605, ..., 214.1131897 ,\n", " 210.98692322, 208.78648376]],\n", "\n", " [[214.6018219 , 215.97660828, 215.11463928, ..., 215.63418579,\n", " 215.11351013, 215.05775452],\n", " [217.36659241, 217.99145508, 217.28042603, ..., 217.16047668,\n", " 217.06045532, 216.31282043],\n", " [220.6197052 , 221.49935913, 221.74649048, ..., 219.66426086,\n", " 219.0226593 , 218.87825012],\n", " ...,\n", " [205.20707703, 208.00669861, 212.51377869, ..., 205.86964417,\n", " 203.92337036, 205.05079651],\n", " [202.4234314 , 204.04801941, 207.63363647, ..., 198.36546326,\n", " 197.54985046, 198.2558136 ],\n", " [198.34162903, 196.90713501, 197.9355011 , ..., 202.5773468 ,\n", " 199.10409546, 198.11695862]]]])\n", "Coordinates:\n", " * year (year) int64 1998 1999 2000 2001 2002 ... 2013 2014 2015 2016 2017\n", " * pentad (pentad) int64 1 2 3 4 5 6 7 8 9 10 ... 65 66 67 68 69 70 71 72 73\n", " * lat (lat) float32 -44.5 -43.5 -42.5 -41.5 -40.5 ... 41.5 42.5 43.5 44.5\n", " * lon (lon) float32 0.5 1.5 2.5 3.5 4.5 ... 355.5 356.5 357.5 358.5 359.5" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "olr_ptd = xr.DataArray( \n", " dims=['year','pentad','lat','lon'],\n", " coords=dict(year=range(1998,2018), \n", " pentad=range(1,74),\n", " lat=olr_da.lat,\n", " lon=olr_da.lon),\n", " name='olr')\n", "for yy in olr_ptd.year: \n", " for p in olr_ptd.pentad:\n", " olr_ptd.loc[yy,p,:,:] = (olr_noleap[ int((yy-1998)*365+ (p-1)*5) : int((yy-1998)*365+ (p-1)*5 + 14),:,: ]\n", " .mean(axis=0))\n", "olr_ptd" ] }, { "cell_type": "markdown", "id": "8d30edaa", "metadata": {}, "source": [ "以上的計算過程,就是先建立一個空白的、帶有(year, pentad, lat, lon)座標軸的DataArray,再將候平均的結果儲存進去。\n", "\n", "```{Note} \n", "`olr_ptd.loc[yy,p,:,:]` 還記得`loc`這個選取資料範圍的方式嗎?(see Chapter 3)\n", "```" ] }, { "cell_type": "markdown", "id": "7a696c76", "metadata": {}, "source": [ "```{caution}\n", "養成將DataArrray變數取名稱的好習慣:`name='olr'`,在`xr.merge()`、輸出NetCDF檔案的時候才不會出錯。\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.9" } }, "nbformat": 4, "nbformat_minor": 5 }