{ "cells": [ { "cell_type": "markdown", "id": "2e35e4f7", "metadata": {}, "source": [ "(xarray-intro)=\n", "# Xarray - brief introduction\n", "\n", "```{seealso}\n", "The complete source code of this tutorial can be found in\n", "\n", "{nb-download}`Xarray introduction.ipynb`\n", "```\n", "\n", "The Quantify dataset is based on {doc}`Xarray `.\n", "This subsection is a very brief overview of some concepts and functionalities of xarray.\n", "Here we use only pure xarray concepts and terminology.\n", "\n", "This is not intended as an extensive introduction to xarray.\n", "Please consult the {doc}`xarray documentation ` if you never used it\n", "before (it has very neat features!)." ] }, { "cell_type": "code", "execution_count": 1, "id": "fbeea621", "metadata": { "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "import numpy as np\n", "import xarray as xr\n", "from rich import pretty\n", "\n", "pretty.install()" ] }, { "cell_type": "markdown", "id": "c8bd036f", "metadata": {}, "source": [ "There are different ways to create a new xarray dataset.\n", "Below we exemplify a few of them to showcase specific functionalities.\n", "\n", "An xarray dataset has **Dimensions** and **Variables**. Variables \"lie\" along at least\n", "one dimension:" ] }, { "cell_type": "code", "execution_count": 2, "id": "63e688c4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 80B\n",
       "Dimensions:   (position_x: 5, velocity_x: 5)\n",
       "Dimensions without coordinates: position_x, velocity_x\n",
       "Data variables:\n",
       "    position  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "    velocity  (velocity_x) float64 40B 0.0 2.5 5.0 7.5 10.0\n",
       "Attributes:\n",
       "    my_attribute_name:  some meta information
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.Dataset\u001b[0m\u001b[1m>\u001b[0m Size: 80B\n", "Dimensions: \u001b[1m(\u001b[0mposition_x: \u001b[1;36m5\u001b[0m, velocity_x: \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", "Dimensions without coordinates: position_x, velocity_x\n", "Data variables:\n", " position \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", " velocity \u001b[1m(\u001b[0mvelocity_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m \u001b[1;36m7.5\u001b[0m \u001b[1;36m10.0\u001b[0m\n", "Attributes:\n", " my_attribute_name: some meta information" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 5\n", "\n", "values_pos = np.linspace(-5, 5, n)\n", "dimensions_pos = (\"position_x\",)\n", "# the \"unit\" and \"long_name\" are a convention for automatic plotting\n", "attrs_pos = dict(unit=\"m\", long_name=\"Position\") # attributes of this data variable\n", "\n", "values_vel = np.linspace(0, 10, n)\n", "dimensions_vel = (\"velocity_x\",)\n", "attrs_vel = dict(unit=\"m/s\", long_name=\"Velocity\")\n", "\n", "data_vars = dict(\n", " position=(dimensions_pos, values_pos, attrs_pos),\n", " velocity=(dimensions_vel, values_vel, attrs_vel),\n", ")\n", "\n", "dataset_attrs = dict(my_attribute_name=\"some meta information\")\n", "\n", "dataset = xr.Dataset(\n", " data_vars=data_vars,\n", " attrs=dataset_attrs,\n", ") # dataset attributes\n", "dataset" ] }, { "cell_type": "code", "execution_count": 3, "id": "dc96be76", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\u001b[1;35mFrozenMappingWarningOnValuesAccess\u001b[0m\u001b[1m(\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'position_x'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'velocity_x'\u001b[0m: \u001b[1;36m5\u001b[0m\u001b[1m}\u001b[0m\u001b[1m)\u001b[0m"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.dims"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f4b62946",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "\u001b[1;35mFrozen\u001b[0m\u001b[1m(\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'position'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mxarray.Variable\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m> Size: 40B\u001b[0m\n",
       "\u001b[1;35marray\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;36m-5\u001b[0m\u001b[39m. , \u001b[0m\u001b[1;36m-2.5\u001b[0m\u001b[39m,  \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m. ,  \u001b[0m\u001b[1;36m2.5\u001b[0m\u001b[39m,  \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m. \u001b[0m\u001b[1;39m]\u001b[0m\u001b[1;39m)\u001b[0m\n",
       "\u001b[39mAttributes:\u001b[0m\n",
       "\u001b[39m    unit:       m\u001b[0m\n",
       "\u001b[39m    long_name:  Position, \u001b[0m\u001b[32m'velocity'\u001b[0m\u001b[39m: \u001b[0m Size: 40B\n",
       "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0\u001b[0m. ,  \u001b[1;36m2.5\u001b[0m,  \u001b[1;36m5\u001b[0m. ,  \u001b[1;36m7.5\u001b[0m, \u001b[1;36m10\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
       "Attributes:\n",
       "    unit:       m/s\n",
       "    long_name:  Velocity\u001b[1m}\u001b[0m\u001b[1m)\u001b[0m"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.variables"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4898cb49",
   "metadata": {},
   "source": [
    "A variable can be \"promoted\" to (or defined as) a **Coordinate** for its dimension(s):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a180b23c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 80B\n",
       "Dimensions:   (position_x: 5)\n",
       "Coordinates:\n",
       "    position  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "Dimensions without coordinates: position_x\n",
       "Data variables:\n",
       "    velocity  (position_x) float64 40B 26.0 7.25 1.0 7.25 26.0\n",
       "Attributes:\n",
       "    my_attribute_name:  some meta information
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.Dataset\u001b[0m\u001b[1m>\u001b[0m Size: 80B\n", "Dimensions: \u001b[1m(\u001b[0mposition_x: \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " position \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", "Dimensions without coordinates: position_x\n", "Data variables:\n", " velocity \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m26.0\u001b[0m \u001b[1;36m7.25\u001b[0m \u001b[1;36m1.0\u001b[0m \u001b[1;36m7.25\u001b[0m \u001b[1;36m26.0\u001b[0m\n", "Attributes:\n", " my_attribute_name: some meta information" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "values_vel = 1 + values_pos**2\n", "data_vars = dict(\n", " position=(dimensions_pos, values_pos, attrs_pos),\n", " # now the velocity array \"lies\" along the same dimension as the position array\n", " velocity=(dimensions_pos, values_vel, attrs_vel),\n", ")\n", "dataset = xr.Dataset(\n", " data_vars=data_vars,\n", " # NB We could set \"position\" as a coordinate directly when creating the dataset:\n", " # coords=dict(position=(dimensions_pos, values_pos, attrs_pos)),\n", " attrs=dataset_attrs,\n", ")\n", "\n", "# Promote the \"position\" variable to a coordinate:\n", "# In general, most of the functions that modify the structure of the xarray dataset will\n", "# return a new object, hence the assignment\n", "dataset = dataset.set_coords([\"position\"])\n", "dataset" ] }, { "cell_type": "code", "execution_count": 6, "id": "8e5f2caa", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'position' (position_x: 5)> Size: 40B\n",
       "array([-5. , -2.5,  0. ,  2.5,  5. ])\n",
       "Coordinates:\n",
       "    position  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "Dimensions without coordinates: position_x\n",
       "Attributes:\n",
       "    unit:       m\n",
       "    long_name:  Position
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.DataArray\u001b[0m\u001b[39m \u001b[0m\u001b[32m'position'\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 40B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-5\u001b[0m. , \u001b[1;36m-2.5\u001b[0m, \u001b[1;36m0\u001b[0m. , \u001b[1;36m2.5\u001b[0m, \u001b[1;36m5\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " position \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", "Dimensions without coordinates: position_x\n", "Attributes:\n", " unit: m\n", " long_name: Position" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.coords[\"position\"]" ] }, { "cell_type": "markdown", "id": "1804e77a", "metadata": {}, "source": [ "Note that the xarray coordinates are available as variables as well:" ] }, { "cell_type": "code", "execution_count": 7, "id": "a4a2851c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Variable (position_x: 5)> Size: 40B\n",
       "array([-5. , -2.5,  0. ,  2.5,  5. ])\n",
       "Attributes:\n",
       "    unit:       m\n",
       "    long_name:  Position
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.Variable\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 40B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-5\u001b[0m. , \u001b[1;36m-2.5\u001b[0m, \u001b[1;36m0\u001b[0m. , \u001b[1;36m2.5\u001b[0m, \u001b[1;36m5\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", "Attributes:\n", " unit: m\n", " long_name: Position" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.variables[\"position\"]" ] }, { "cell_type": "markdown", "id": "8b12f767", "metadata": {}, "source": [ "Which, on its own, might not be very useful yet, however, xarray coordinates can be set\n", "to **index** other variables ({func}`~quantify_core.data.handling.to_gridded_dataset`\n", "does this for the Quantify dataset), as shown below (note the bold font in the output!):" ] }, { "cell_type": "code", "execution_count": 8, "id": "f58a7fa2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 80B\n",
       "Dimensions:     (position_x: 5)\n",
       "Coordinates:\n",
       "  * position_x  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "Data variables:\n",
       "    velocity    (position_x) float64 40B 26.0 7.25 1.0 7.25 26.0\n",
       "Attributes:\n",
       "    my_attribute_name:  some meta information
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.Dataset\u001b[0m\u001b[1m>\u001b[0m Size: 80B\n", "Dimensions: \u001b[1m(\u001b[0mposition_x: \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " * position_x \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", "Data variables:\n", " velocity \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m26.0\u001b[0m \u001b[1;36m7.25\u001b[0m \u001b[1;36m1.0\u001b[0m \u001b[1;36m7.25\u001b[0m \u001b[1;36m26.0\u001b[0m\n", "Attributes:\n", " my_attribute_name: some meta information" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset = dataset.set_index({\"position_x\": \"position\"})\n", "dataset.position_x.attrs[\"unit\"] = \"m\"\n", "dataset.position_x.attrs[\"long_name\"] = \"Position x\"\n", "dataset" ] }, { "cell_type": "markdown", "id": "b74e4c79", "metadata": {}, "source": [ "At this point the reader might get very confused. In an attempt to clarify, we now have\n", "a dimension, a coordinate and a variable with the same name `\"position_x\"`." ] }, { "cell_type": "code", "execution_count": 9, "id": "e8dcb228", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\u001b[1m(\u001b[0m\u001b[3;92mTrue\u001b[0m, \u001b[3;92mTrue\u001b[0m, \u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(\n",
    "    \"position_x\" in dataset.dims,\n",
    "    \"position_x\" in dataset.coords,\n",
    "    \"position_x\" in dataset.variables,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8c96c7c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_934/457231006.py:1: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.\n",
      "  dataset.dims[\"position_x\"]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\u001b[1;36m5\u001b[0m"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.dims[\"position_x\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1b38f2df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'position_x' (position_x: 5)> Size: 40B\n",
       "array([-5. , -2.5,  0. ,  2.5,  5. ])\n",
       "Coordinates:\n",
       "  * position_x  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "Attributes:\n",
       "    unit:       m\n",
       "    long_name:  Position x
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.DataArray\u001b[0m\u001b[39m \u001b[0m\u001b[32m'position_x'\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 40B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-5\u001b[0m. , \u001b[1;36m-2.5\u001b[0m, \u001b[1;36m0\u001b[0m. , \u001b[1;36m2.5\u001b[0m, \u001b[1;36m5\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " * position_x \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", "Attributes:\n", " unit: m\n", " long_name: Position x" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.coords[\"position_x\"]" ] }, { "cell_type": "code", "execution_count": 12, "id": "bdc518fc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.IndexVariable 'position_x' (position_x: 5)> Size: 40B\n",
       "array([-5. , -2.5,  0. ,  2.5,  5. ])\n",
       "Attributes:\n",
       "    unit:       m\n",
       "    long_name:  Position x
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.IndexVariable\u001b[0m\u001b[39m \u001b[0m\u001b[32m'position_x'\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 40B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-5\u001b[0m. , \u001b[1;36m-2.5\u001b[0m, \u001b[1;36m0\u001b[0m. , \u001b[1;36m2.5\u001b[0m, \u001b[1;36m5\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", "Attributes:\n", " unit: m\n", " long_name: Position x" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.variables[\"position_x\"]" ] }, { "cell_type": "markdown", "id": "d6b85f15", "metadata": {}, "source": [ "Here the intention is to make the reader aware of this peculiar behavior.\n", "Please consult the {doc}`xarray documentation ` for more details.\n", "\n", "An example of how this can be useful is to retrieve data from an xarray variable using\n", "one of its coordinates to select the desired entries:" ] }, { "cell_type": "code", "execution_count": 13, "id": "e19a7914", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'velocity' (position_x: 5)> Size: 40B\n",
       "array([26.  ,  7.25,  1.  ,  7.25, 26.  ])\n",
       "Coordinates:\n",
       "  * position_x  (position_x) float64 40B -5.0 -2.5 0.0 2.5 5.0\n",
       "Attributes:\n",
       "    unit:       m/s\n",
       "    long_name:  Velocity
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.DataArray\u001b[0m\u001b[39m \u001b[0m\u001b[32m'velocity'\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mposition_x: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 40B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m26\u001b[0m. , \u001b[1;36m7.25\u001b[0m, \u001b[1;36m1\u001b[0m. , \u001b[1;36m7.25\u001b[0m, \u001b[1;36m26\u001b[0m. \u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " * position_x \u001b[1m(\u001b[0mposition_x\u001b[1m)\u001b[0m float64 40B \u001b[1;36m-5.0\u001b[0m \u001b[1;36m-2.5\u001b[0m \u001b[1;36m0.0\u001b[0m \u001b[1;36m2.5\u001b[0m \u001b[1;36m5.0\u001b[0m\n", "Attributes:\n", " unit: m/s\n", " long_name: Velocity" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.velocity" ] }, { "cell_type": "code", "execution_count": 14, "id": "50f7acd8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'velocity' ()> Size: 8B\n",
       "array(7.25)\n",
       "Coordinates:\n",
       "    position_x  float64 8B 2.5\n",
       "Attributes:\n",
       "    unit:       m/s\n",
       "    long_name:  Velocity
" ], "text/plain": [ "\n", "\u001b[1m<\u001b[0m\u001b[1;95mxarray.DataArray\u001b[0m\u001b[39m \u001b[0m\u001b[32m'velocity'\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m Size: 8B\n", "\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m7.25\u001b[0m\u001b[1m)\u001b[0m\n", "Coordinates:\n", " position_x float64 8B \u001b[1;36m2.5\u001b[0m\n", "Attributes:\n", " unit: m/s\n", " long_name: Velocity" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "retrieved_value = dataset.velocity.sel(position_x=2.5)\n", "retrieved_value" ] }, { "cell_type": "markdown", "id": "550fee7f", "metadata": {}, "source": [ "Note that without this feature we would have to keep track of numpy integer indexes to\n", "retrieve the desired data:" ] }, { "cell_type": "code", "execution_count": 15, "id": "afa78109", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\u001b[1m(\u001b[0m\u001b[1;35mnp.float64\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m7.25\u001b[0m\u001b[1m)\u001b[0m, np.True_\u001b[1m)\u001b[0m"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.velocity.values[3], retrieved_value.values == dataset.velocity.values[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca6a51d7",
   "metadata": {},
   "source": [
    "One of the great features of xarray is automatic plotting (explore the xarray\n",
    "documentation for more advanced capabilities!):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5d37260f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "\u001b[1m<\u001b[0m\u001b[1;95mFigure\u001b[0m\u001b[39m size 64\u001b[0m\u001b[1;36m0x480\u001b[0m\u001b[39m with \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m Axes\u001b[0m\u001b[1m>\u001b[0m"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = dataset.velocity.plot(marker=\"o\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23aa150d",
   "metadata": {},
   "source": [
    "Note the automatic labels and unit."
   ]
  }
 ],
 "metadata": {
  "file_format": "mystnb",
  "jupytext": {
   "text_representation": {
    "extension": ".md",
    "format_name": "myst"
   }
  },
  "kernelspec": {
   "display_name": "python3",
   "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.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}