{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.BZg4Vecm/b1/python-xarray_2025.03.1-3_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.BZg4Vecm/b2/python-xarray_2025.03.1-3_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,3 +1,3 @@\n \n- 2f8318997ffc2861955d55bafd5212d6 5274220 doc optional python-xarray-doc_2025.03.1-3_all.deb\n+ b2d2c82b66a22ba9b9bdbf9eef00e6d8 5273832 doc optional python-xarray-doc_2025.03.1-3_all.deb\n 0731be3263683b92772a49a1aafb406d 820032 python optional python3-xarray_2025.03.1-3_all.deb\n"}, {"source1": "python-xarray-doc_2025.03.1-3_all.deb", "source2": "python-xarray-doc_2025.03.1-3_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2025-04-21 13:55:07.000000 debian-binary\n--rw-r--r-- 0 0 0 7568 2025-04-21 13:55:07.000000 control.tar.xz\n--rw-r--r-- 0 0 0 5266460 2025-04-21 13:55:07.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 7564 2025-04-21 13:55:07.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 5266076 2025-04-21 13:55:07.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./control", "source2": "./control", "unified_diff": "@@ -1,13 +1,13 @@\n Package: python-xarray-doc\n Source: python-xarray\n Version: 2025.03.1-3\n Architecture: all\n Maintainer: Debian Science Maintainers Let\u2019s create a simple plot of 2-m air temperature in degrees Celsius: Write equations to calculate the vertical coordinate. These will be only evaluated when data is requested. Information about the ROMS vertical coordinate can be found (here)[https://www.myroms.org/wiki/Vertical_S-coordinate] In short, for The function we will apply is Plot the first timestep: We first have to come up with the weights, - calculate the month length for each monthly data record - calculate weights using Finally, we just need to multiply our weights by the In this example, the logical coordinates are Control the map projection parameters on multiple axes This example illustrates how to plot multiple maps and control their extent and aspect ratio. For more details see this discussion on github. Visualizing your datasets is quick and convenient: Note the automatic labeling with names and units. Our effort in adding metadata attributes has paid off! Many aspects of these figures are customizable: see Plotting. Note This method replicates the behavior of [3]:\n
\n-Error in callback <function _draw_all_if_interactive at 0x7f1216215080> (for post_execute), with arguments args (),kwargs {}:\n+Error in callback <function _draw_all_if_interactive at 0x7fe4da838fe0> (for post_execute), with arguments args (),kwargs {}:\n
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -93,15 +93,15 @@\n File /usr/lib/python3/dist-packages/urllib3/connection.py:205, in\n HTTPConnection._new_conn(self)\n 204 except socket.gaierror as e:\n --> 205 raise NameResolutionError(self.host, self, e) from e\n 206 except SocketTimeout as e:\n \n NameResolutionError:
Add a lazilly calculated vertical coordinates\u00b6
\n Vtransform==2
as used in this example,np.interp
which expects 1D numpy arrays. This functionality is already implemented in xarray so we use that capability to make sure we are not making mistakes.[2]:\n
[3]:\n
[ ]:\n
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -92,15 +92,15 @@\n File /usr/lib/python3/dist-packages/urllib3/connection.py:205, in\n HTTPConnection._new_conn(self)\n 204 except socket.gaierror as e:\n --> 205 raise NameResolutionError(self.host, self, e) from e\n 206 except SocketTimeout as e:\n \n NameResolutionError:
Now for the heavy lifting:\u00b6
\n groupby('time.season')
Dataset
and sum along the time dimension. Creating a DataArray
for the month length is as easy as using the days_in_month
accessor on the time coordinate. The calendar type, in this case 'noleap'
, is automatically considered in this operation.x
and y
, while the physical coordinates are xc
and yc
, which represent the longitudes and latitudes of the data.[3]:\n
Multiple plots and map projections\u00b6
\n <xarray.Dataset> Size: 41kB\n Dimensions: (time: 731, location: 3)\n Coordinates:\n * time (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31\n * location (location) <U2 24B 'IA' 'IN' 'IL'\n Data variables:\n tmin (time, location) float64 18kB -8.037 -1.788 ... -1.346 -4.544\n- tmax (time, location) float64 18kB 12.98 3.31 6.779 ... 3.343 3.805
PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
Examine a dataset with pandas and seaborn\u00b6
\n Convert to a pandas DataFrame\u00b6
\n [2]:\n@@ -697,15 +697,15 @@\n
[5]:\n
\n-<seaborn.axisgrid.PairGrid at 0x7f14876b6e40>\n+<seaborn.axisgrid.PairGrid at 0x7f862200ee40>\n
\n@@ -1110,26 +1110,26 @@\n [0. , 0. , 0. ],\n [0. , 0. , 0. ],\n [0. , 0.01612903, 0. ],\n [0.33333333, 0.35 , 0.23333333],\n [0.93548387, 0.85483871, 0.82258065]])\n Coordinates:\n * location (location) <U2 24B 'IA' 'IN' 'IL'\n- * month (month) int64 96B 1 2 3 4 5 6 7 8 9 10 11 12
array(['IA', 'IN', 'IL'], dtype='<U2')
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
PandasIndex(Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='int64', name='month'))
[7]:\n
freeze.to_pandas().plot()\n
PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
[12]:\n
df = both.sel(time="2000").mean("location").reset_coords(drop=True).to_dataframe()\n df.head()\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -142,15 +142,15 @@\n [4]:\n
array(['IA', 'IN', 'IL'], dtype='<U2')
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
PandasIndex(Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='int64', name='month'))
Plotting\u00b6
\n In [37]: data.plot()\n-Out[37]: <matplotlib.collections.QuadMesh at 0x7f9d83c4a660>\n+Out[37]: <matplotlib.collections.QuadMesh at 0x7f1b6d2363c0>\n
\n
pandas\u00b6
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -253,15 +253,15 @@\n [0.37342613, 1.49497537, 1.33584385]])\n Coordinates:\n * x (x) int64 16B 10 20\n Dimensions without coordinates: y\n *\b**\b**\b**\b**\b* P\bPl\blo\bot\btt\bti\bin\bng\bg_\b?\b\u00b6 *\b**\b**\b**\b**\b*\n Visualizing your datasets is quick and convenient:\n In [37]: data.plot()\n-Out[37]: apply_ufunc
\", \"Compare weighted and unweighted mean temperature\", \"Blank template\", \"Calculating Seasonal Averages from Time Series of Monthly Means\", \"Working with Multidimensional Coordinates\", \"Visualization Gallery\", \"Toy weather data\", \"Gallery\", \"Frequently Asked Questions\", \"Getting Started\", \"Installation\", \"Quick overview\", \"Overview: Why xarray?\", \"Getting Help\", \"How do I \\u2026\", \"Xarray documentation\", \"Alternative chunked array types\", \"Integrating with duck arrays\", \"Extending xarray using accessors\", \"How to add a new backend\", \"How to create a custom index\", \"Xarray Internals\", \"Internal Design\", \"Interoperability of Xarray\", \"Time Coding\", \"Zarr Encoding Specification\", \"Development roadmap\", \"Tutorials and Videos\", \"Combining data\", \"Computation\", \"Parallel Computing with Dask\", \"Data Structures\", \"Working with numpy-like arrays\", \"GroupBy: Group and Bin Data\", \"Hierarchical data\", \"User Guide\", \"Indexing and selecting data\", \"Interpolating data\", \"Reading and writing files\", \"Configuration\", \"Working with pandas\", \"Plotting\", \"Reshaping and reorganizing data\", \"Terminology\", \"Testing your code\", \"Time series data\", \"Weather and climate data\", \"What\\u2019s New\"],\n \"titleterms\": {\n \"\": [13, 16, 55],\n \"0\": 55,\n \"01\": 55,\n \"02\": 55,\n"}]}, {"source1": "./usr/share/doc/python-xarray-doc/html/user-guide/computation.html", "source2": "./usr/share/doc/python-xarray-doc/html/user-guide/computation.html", "unified_diff": "@@ -934,16 +934,16 @@\n <xarray.Dataset> Size: 2kB\n Dimensions: (param: 10, cov_i: 10, cov_j: 10)\n Coordinates:\n * param (param) <U7 280B 'a0' 'xc0' ... 'xalpha1' 'yalpha1'\n * cov_i (cov_i) <U7 280B 'a0' 'xc0' ... 'xalpha1' 'yalpha1'\n * cov_j (cov_j) <U7 280B 'a0' 'xc0' ... 'xalpha1' 'yalpha1'\n Data variables:\n- curvefit_coefficients (param) float64 80B -0.659 4.858 ... 2.066 1.329\n- curvefit_covariance (cov_i, cov_j) float64 800B 5.662e+11 ... 6.911e-05\n+ curvefit_coefficients (param) float64 80B 3.0 1.004 1.003 ... 1.007 1.008\n+ curvefit_covariance (cov_i, cov_j) float64 800B 3.362e-05 ... 2.125e-05\n \n \n scipy.optimize.curve_fit()
.func(ds)
). This allows you to write pipelines for\n transforming your data (using \u201cmethod chaining\u201d) instead of writing hard to\n follow nested function calls:
# these lines are equivalent, but with pipe we can make the logic flow\n # entirely from left to right\n In [64]: plt.plot((2 * ds.temperature.sel(loc=0)).mean("instrument"))\n-Out[64]: [<matplotlib.lines.Line2D at 0x7f9d72adec10>]\n+Out[64]: [<matplotlib.lines.Line2D at 0x7f1b4fe76ad0>]\n \n In [65]: (ds.temperature.sel(loc=0).pipe(lambda x: 2 * x).mean("instrument").pipe(plt.plot))\n-Out[65]: [<matplotlib.lines.Line2D at 0x7f9d72ade990>]\n+Out[65]: [<matplotlib.lines.Line2D at 0x7f1b4fe76850>]\n
Both pipe
and assign
replicate the pandas methods of the same names\n (DataFrame.pipe
and\n DataFrame.assign
).
With xarray, there is no performance penalty for creating new datasets, even if\n variables are lazily loaded from a file on disk. Creating new objects instead\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -585,19 +585,19 @@\n There is also the pipe() method that allows you to use a method call with an\n external function (e.g., ds.pipe(func)) instead of simply calling it (e.g.,\n func(ds)). This allows you to write pipelines for transforming your data (using\n \u201cmethod chaining\u201d) instead of writing hard to follow nested function calls:\n # these lines are equivalent, but with pipe we can make the logic flow\n # entirely from left to right\n In [64]: plt.plot((2 * ds.temperature.sel(loc=0)).mean(\"instrument\"))\n-Out[64]: [ If you were a previous user of the prototype xarray-contrib/datatree package, this is different from what you\u2019re used to!\n In that package the data model was that the data stored in each node actually was completely unrelated. The data model is now slightly stricter.\n This allows us to provide features like Coordinate Inheritance. To demonstrate, let\u2019s first generate some example datasets which are not aligned with one another: Now we have a valid This is a useful way to organise our data because we can still operate on all the groups at once.\n For example we can extract all three timeseries at a specific lat-lon location: or compute the standard deviation of each timeseries to find out how it varies with sampling frequency: This helps to differentiate which variables are defined on the datatree node that you are currently looking at, and which were defined somewhere above it. We can also still perform all the same operations on the whole tree:# (drop the attributes just to make the printed representation shorter)\n In [89]: ds = xr.tutorial.open_dataset("air_temperature").drop_attrs()\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d71772850>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b4e946210>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [90]: ds_daily = ds.resample(time="D").mean("time")\n KeyError: "No variable named 'time'. Variables on the dataset include ['foo', 'x', 'letters']"\n \n \n In [91]: ds_weekly = ds.resample(time="W").mean("time")\n@@ -1055,15 +1055,15 @@\n \u2514\u2500\u2500 Group: /b/B\n
DataTree
structure which contains all the data at each different time frequency, stored in a separate group.In [100]: dt.sel(lat=75, lon=300)\n-ValueError: Dimensions {'lon', 'lat'} do not exist. Expected one or more of set()\n+ValueError: Dimensions {'lat', 'lon'} do not exist. Expected one or more of set()\n
In [101]: dt.std(dim="time")\n ValueError: Dimension(s) 'time' do not exist. Expected one or more of set()\n
In [107]: print(dt["/daily"])\n KeyError: 'Could not find node at /daily'\n
In [108]: dt.sel(lat=[75], lon=[300])\n-ValueError: Dimensions {'lon', 'lat'} do not exist. Expected one or more of set()\n+ValueError: Dimensions {'lat', 'lon'} do not exist. Expected one or more of set()\n \n \n In [109]: dt.std(dim="time")\n ValueError: Dimension(s) 'time' do not exist. Expected one or more of set()\n
In [52]: ds = xr.tutorial.open_dataset("air_temperature")\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d717725d0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b4e946210>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n # Define target latitude and longitude (where weather stations might be)\n In [53]: target_lon = xr.DataArray([200, 201, 202, 205], dims="points")\n \n In [54]: target_lat = xr.DataArray([31, 41, 42, 42], dims="points")\n \n@@ -697,15 +697,15 @@\n
To select and assign values to a portion of a DataArray()
you\n can use indexing with .loc
:
In [57]: ds = xr.tutorial.open_dataset("air_temperature")\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d72adfed0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b4e9456d0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n # add an empty 2D dataarray\n In [58]: ds["empty"] = xr.full_like(ds.air.mean("time"), fill_value=0)\n AttributeError: 'Dataset' object has no attribute 'air'\n \n \n@@ -869,15 +869,15 @@\n
You can also assign values to all variables of a Dataset
at once:
In [83]: ds_org = xr.tutorial.open_dataset("eraint_uvz").isel(\n ....: latitude=slice(56, 59), longitude=slice(255, 258), level=0\n ....: )\n ....: \n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/eraint_uvz.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d71770690>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/eraint_uvz.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b4e945310>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n # set all values to 0\n In [84]: ds = xr.zeros_like(ds_org)\n NameError: name 'ds_org' is not defined\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -476,15 +476,15 @@\n with a new shared output dimension name. In the example below, the selections\n of the closest latitude and longitude are renamed to an output dimension named\n \u201cpoints\u201d:\n In [52]: ds = xr.tutorial.open_dataset(\"air_temperature\")\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by\n NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1b4e946210>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n # Define target latitude and longitude (where weather stations might be)\n In [53]: target_lon = xr.DataArray([200, 201, 202, 205], dims=\"points\")\n \n In [54]: target_lat = xr.DataArray([31, 41, 42, 42], dims=\"points\")\n@@ -516,15 +516,15 @@\n *\b**\b**\b**\b**\b* A\bAs\bss\bsi\big\bgn\bni\bin\bng\bg v\bva\bal\blu\bue\bes\bs w\bwi\bit\bth\bh i\bin\bnd\bde\bex\bxi\bin\bng\bg_\b?\b\u00b6 *\b**\b**\b**\b**\b*\n To select and assign values to a portion of a DataArray() you can use indexing\n with .loc :\n In [57]: ds = xr.tutorial.open_dataset(\"air_temperature\")\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by\n NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1b4e9456d0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n # add an empty 2D dataarray\n In [58]: ds[\"empty\"] = xr.full_like(ds.air.mean(\"time\"), fill_value=0)\n AttributeError: 'Dataset' object has no attribute 'air'\n \n@@ -678,15 +678,15 @@\n In [83]: ds_org = xr.tutorial.open_dataset(\"eraint_uvz\").isel(\n ....: latitude=slice(56, 59), longitude=slice(255, 258), level=0\n ....: )\n ....:\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/eraint_uvz.nc (Caused by\n NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1b4e945310>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n # set all values to 0\n In [84]: ds = xr.zeros_like(ds_org)\n NameError: name 'ds_org' is not defined\n \n"}]}, {"source1": "./usr/share/doc/python-xarray-doc/html/user-guide/interpolation.html", "source2": "./usr/share/doc/python-xarray-doc/html/user-guide/interpolation.html", "unified_diff": "@@ -237,24 +237,24 @@\n ....: np.sin(np.linspace(0, 2 * np.pi, 10)),\n ....: dims="x",\n ....: coords={"x": np.linspace(0, 1, 10)},\n ....: )\n ....: \n \n In [17]: da.plot.line("o", label="original")\n-Out[17]: [<matplotlib.lines.Line2D at 0x7f9d83c75590>]\n+Out[17]: [<matplotlib.lines.Line2D at 0x7f1b6cf411d0>]\n \n In [18]: da.interp(x=np.linspace(0, 1, 100)).plot.line(label="linear (default)")\n-Out[18]: [<matplotlib.lines.Line2D at 0x7f9d72ade990>]\n+Out[18]: [<matplotlib.lines.Line2D at 0x7f1b6d1d6d50>]\n \n In [19]: da.interp(x=np.linspace(0, 1, 100), method="cubic").plot.line(label="cubic")\n-Out[19]: [<matplotlib.lines.Line2D at 0x7f9d83ca3390>]\n+Out[19]: [<matplotlib.lines.Line2D at 0x7f1b6cf73250>]\n \n In [20]: plt.legend()\n-Out[20]: <matplotlib.legend.Legend at 0x7f9d83c4b0e0>\n+Out[20]: <matplotlib.legend.Legend at 0x7f1b6d2370e0>\n
Additional keyword arguments can be passed to scipy\u2019s functions.
\n# fill 0 for the outside of the original coordinates.\n In [21]: da.interp(x=np.linspace(-0.5, 1.5, 10), kwargs={"fill_value": 0.0})\n@@ -439,15 +439,15 @@\n see Missing values.\n \n \n Example\u00b6
\n Let\u2019s see how interp()
works on real data.
\n # Raw data\n In [44]: ds = xr.tutorial.open_dataset("air_temperature").isel(time=0)\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d83c77d90>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b6cf43b10>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [45]: fig, axes = plt.subplots(ncols=2, figsize=(10, 4))\n \n In [46]: ds.air.plot(ax=axes[0])\n AttributeError: 'Dataset' object has no attribute 'air'\n \n@@ -511,15 +511,15 @@\n ....: axes[0].plot(*xr.broadcast(lon.isel(z=idx), lat.isel(z=idx)), "--k")\n ....: \n \n In [61]: axes[0].set_title("Raw data")\n Out[61]: Text(0.5, 1.0, 'Raw data')\n \n In [62]: dsi = ds.interp(lon=lon, lat=lat)\n-ValueError: Dimensions {'lon', 'lat'} do not exist. Expected one or more of FrozenMappingWarningOnValuesAccess({'x': 3, 'y': 4})\n+ValueError: Dimensions {'lat', 'lon'} do not exist. Expected one or more of FrozenMappingWarningOnValuesAccess({'x': 3, 'y': 4})\n \n \n In [63]: dsi.air.plot(ax=axes[1])\n NameError: name 'dsi' is not defined\n \n \n In [64]: axes[1].set_title("Remapped data")\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -153,26 +153,26 @@\n ....: np.sin(np.linspace(0, 2 * np.pi, 10)),\n ....: dims=\"x\",\n ....: coords={\"x\": np.linspace(0, 1, 10)},\n ....: )\n ....:\n \n In [17]: da.plot.line(\"o\", label=\"original\")\n-Out[17]: []\n+Out[17]: []\n \n In [18]: da.interp(x=np.linspace(0, 1, 100)).plot.line(label=\"linear\n (default)\")\n-Out[18]: []\n+Out[18]: []\n \n In [19]: da.interp(x=np.linspace(0, 1, 100), method=\"cubic\").plot.line\n (label=\"cubic\")\n-Out[19]: []\n+Out[19]: []\n \n In [20]: plt.legend()\n-Out[20]: \n+Out[20]: \n _\b[_\b._\b._\b/_\b__\bi_\bm_\ba_\bg_\be_\bs_\b/_\bi_\bn_\bt_\be_\br_\bp_\bo_\bl_\ba_\bt_\bi_\bo_\bn_\b__\bs_\ba_\bm_\bp_\bl_\be_\b1_\b._\bp_\bn_\bg_\b]\n Additional keyword arguments can be passed to scipy\u2019s functions.\n # fill 0 for the outside of the original coordinates.\n In [21]: da.interp(x=np.linspace(-0.5, 1.5, 10), kwargs={\"fill_value\": 0.0})\n Out[21]:\n Size: 80B\n array([ 0. , 0. , 0. , 0.814, 0.604, -0.604, -0.814, 0. , 0. ,\n@@ -338,15 +338,15 @@\n *\b**\b**\b**\b**\b* E\bEx\bxa\bam\bmp\bpl\ble\be_\b?\b\u00b6 *\b**\b**\b**\b**\b*\n Let\u2019s see how interp() works on real data.\n # Raw data\n In [44]: ds = xr.tutorial.open_dataset(\"air_temperature\").isel(time=0)\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by\n NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1b6cf43b10>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n In [45]: fig, axes = plt.subplots(ncols=2, figsize=(10, 4))\n \n In [46]: ds.air.plot(ax=axes[0])\n AttributeError: 'Dataset' object has no attribute 'air'\n@@ -411,15 +411,15 @@\n k\")\n ....:\n \n In [61]: axes[0].set_title(\"Raw data\")\n Out[61]: Text(0.5, 1.0, 'Raw data')\n \n In [62]: dsi = ds.interp(lon=lon, lat=lat)\n-ValueError: Dimensions {'lon', 'lat'} do not exist. Expected one or more of\n+ValueError: Dimensions {'lat', 'lon'} do not exist. Expected one or more of\n FrozenMappingWarningOnValuesAccess({'x': 3, 'y': 4})\n \n \n In [63]: dsi.air.plot(ax=axes[1])\n NameError: name 'dsi' is not defined\n \n \n"}]}, {"source1": "./usr/share/doc/python-xarray-doc/html/user-guide/io.html", "source2": "./usr/share/doc/python-xarray-doc/html/user-guide/io.html", "unified_diff": "@@ -630,15 +630,15 @@\n ....: "y": pd.date_range("2000-01-01", periods=5),\n ....: "z": ("x", list("abcd")),\n ....: },\n ....: )\n ....: \n \n In [13]: ds.to_zarr("path/to/directory.zarr")\n-Out[13]: <xarray.backends.zarr.ZarrStore at 0x7f9d71ad95a0>\n+Out[13]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbd090>\n
\n \n (The suffix .zarr
is optional\u2013just a reminder that a zarr store lives\n there.) If the directory does not exist, it will be created. If a zarr\n store is already present at that path, an error will be raised, preventing it\n from being overwritten. To override this behavior and overwrite an existing\n store, add mode='w'
when invoking to_zarr()
.
\n@@ -658,19 +658,19 @@\n To read back a zarr dataset that has been created this way, we use the\n open_zarr()
method:
\n In [14]: ds_zarr = xr.open_zarr("path/to/directory.zarr")\n \n In [15]: ds_zarr\n Out[15]: \n <xarray.Dataset> Size: 264B\n-Dimensions: (x: 4, y: 5)\n+Dimensions: (y: 5, x: 4)\n Coordinates:\n- z (x) object 32B dask.array<chunksize=(4,), meta=np.ndarray>\n * y (y) datetime64[ns] 40B 2000-01-01 2000-01-02 ... 2000-01-05\n * x (x) int64 32B 10 20 30 40\n+ z (x) object 32B dask.array<chunksize=(4,), meta=np.ndarray>\n Data variables:\n foo (x, y) float64 160B dask.array<chunksize=(4, 5), meta=np.ndarray>\n
\n \n \n Cloud Storage Buckets\u00b6
\n It is possible to read and write xarray datasets directly from / to cloud\n@@ -724,36 +724,36 @@\n \n In [18]: ds = xr.Dataset({"foo": ("x", dummies)}, coords={"x": np.arange(30)})\n \n In [19]: path = "path/to/directory.zarr"\n \n # Now we write the metadata without computing any array values\n In [20]: ds.to_zarr(path, compute=False)\n-Out[20]: Delayed('_finalize_store-f2e66743-f1e1-4c23-b89d-bab2eaa7f2d5')\n+Out[20]: Delayed('_finalize_store-c22c6ddf-8fb6-4934-ab75-c108e6108f08')\n
Now, a Zarr store with the correct variable shapes and attributes exists that\n can be filled out by subsequent calls to to_zarr
.\n Setting region="auto"
will open the existing store and determine the\n correct alignment of the new data with the existing dimensions, or as an\n explicit mapping from dimension names to Python slice
objects indicating\n where the data should be written (in index space, not label space), e.g.,
# For convenience, we'll slice a single dataset, but in the real use-case\n # we would create them separately possibly even from separate processes.\n In [21]: ds = xr.Dataset({"foo": ("x", np.arange(30))}, coords={"x": np.arange(30)})\n \n # Any of the following region specifications are valid\n In [22]: ds.isel(x=slice(0, 10)).to_zarr(path, region="auto")\n-Out[22]: <xarray.backends.zarr.ZarrStore at 0x7f9d71ada7a0>\n+Out[22]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbe290>\n \n In [23]: ds.isel(x=slice(10, 20)).to_zarr(path, region={"x": "auto"})\n-Out[23]: <xarray.backends.zarr.ZarrStore at 0x7f9d71adaa70>\n+Out[23]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbe3b0>\n \n In [24]: ds.isel(x=slice(20, 30)).to_zarr(path, region={"x": slice(20, 30)})\n-Out[24]: <xarray.backends.zarr.ZarrStore at 0x7f9d71ca4820>\n+Out[24]: <xarray.backends.zarr.ZarrStore at 0x7f1b4f078310>\n
Concurrent writes with region
are safe as long as they modify distinct\n chunks in the underlying Zarr arrays (or use an appropriate lock
).
As a safety check to make it harder to inadvertently override existing values,\n if you set region
then all variables included in a Dataset must have\n dimensions included in region
. Other variables (typically coordinates)\n@@ -816,28 +816,28 @@\n ....: "y": [1, 2, 3, 4, 5],\n ....: "t": pd.date_range("2001-01-01", periods=2),\n ....: },\n ....: )\n ....: \n \n In [30]: ds1.to_zarr("path/to/directory.zarr")\n-Out[30]: <xarray.backends.zarr.ZarrStore at 0x7f9d71adbb50>\n+Out[30]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbf640>\n \n In [31]: ds2 = xr.Dataset(\n ....: {"foo": (("x", "y", "t"), np.random.rand(4, 5, 2))},\n ....: coords={\n ....: "x": [10, 20, 30, 40],\n ....: "y": [1, 2, 3, 4, 5],\n ....: "t": pd.date_range("2001-01-03", periods=2),\n ....: },\n ....: )\n ....: \n \n In [32]: ds2.to_zarr("path/to/directory.zarr", append_dim="t")\n-Out[32]: <xarray.backends.zarr.ZarrStore at 0x7f9d71adbac0>\n+Out[32]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbf6d0>\n
Chunk sizes may be specified in one of three ways when writing to a zarr store:
\nFor example, let\u2019s say we\u2019re working with a dataset with dimensions\n ('time', 'x', 'y')
, a variable Tair
which is chunked in x
and y
,\n and two multi-dimensional coordinates xc
and yc
:
In [33]: ds = xr.tutorial.open_dataset("rasm")\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/rasm.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d71bdf9d0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/rasm.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1b4edaee90>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [34]: ds["Tair"] = ds["Tair"].chunk({"x": 100, "y": 100})\n KeyError: "No variable named 'Tair'. Variables on the dataset include ['foo', 'x']"\n \n \n In [35]: ds\n@@ -882,15 +882,15 @@\n foo (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29\n
These multi-dimensional coordinates are only two-dimensional and take up very little\n space on disk or in memory, yet when writing to disk the default zarr behavior is to\n split them into chunks:
\nIn [36]: ds.to_zarr("path/to/directory.zarr", mode="w")\n-Out[36]: <xarray.backends.zarr.ZarrStore at 0x7f9d71998280>\n+Out[36]: <xarray.backends.zarr.ZarrStore at 0x7f1b4ecbfa30>\n \n In [37]: ! ls -R path/to/directory.zarr\n path/to/directory.zarr:\n foo x\tzarr.json\n \n path/to/directory.zarr/foo:\n c zarr.json\n@@ -1081,15 +1081,15 @@\n Ncdata\u00b6
\n Ncdata provides more sophisticated means of transferring data, including entire\n datasets. It uses the file saving and loading functions in both projects to provide a\n more \u201ccorrect\u201d translation between them, but still with very low overhead and not\n using actual disk files.
\n For example:
\n In [48]: ds = xr.tutorial.open_dataset("air_temperature_gradient")\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature_gradient.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d719ad090>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature_gradient.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1ba4334550>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [49]: cubes = ncdata.iris_xarray.cubes_from_xarray(ds)\n NameError: name 'ncdata' is not defined\n \n \n In [50]: print(cubes)\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -481,15 +481,15 @@\n ....: \"y\": pd.date_range(\"2000-01-01\", periods=5),\n ....: \"z\": (\"x\", list(\"abcd\")),\n ....: },\n ....: )\n ....:\n \n In [13]: ds.to_zarr(\"path/to/directory.zarr\")\n-Out[13]: \n+Out[13]: \n (The suffix .zarr is optional\u2013just a reminder that a zarr store lives there.)\n If the directory does not exist, it will be created. If a zarr store is already\n present at that path, an error will be raised, preventing it from being\n overwritten. To override this behavior and overwrite an existing store, add\n mode='w' when invoking to_zarr().\n DataArrays can also be saved to disk using the DataArray.to_zarr() method, and\n loaded from disk using the open_dataarray() function with engine='zarr'.\n@@ -505,19 +505,19 @@\n To read back a zarr dataset that has been created this way, we use the\n open_zarr() method:\n In [14]: ds_zarr = xr.open_zarr(\"path/to/directory.zarr\")\n \n In [15]: ds_zarr\n Out[15]:\n Size: 264B\n-Dimensions: (x: 4, y: 5)\n+Dimensions: (y: 5, x: 4)\n Coordinates:\n- z (x) object 32B dask.array\n * y (y) datetime64[ns] 40B 2000-01-01 2000-01-02 ... 2000-01-05\n * x (x) int64 32B 10 20 30 40\n+ z (x) object 32B dask.array\n Data variables:\n foo (x, y) float64 160B dask.array\n *\b**\b**\b**\b* C\bCl\blo\bou\bud\bd S\bSt\bto\bor\bra\bag\bge\be B\bBu\buc\bck\bke\bet\bts\bs_\b?\b\u00b6 *\b**\b**\b**\b*\n It is possible to read and write xarray datasets directly from / to cloud\n storage buckets using zarr. This example uses the _\bg_\bc_\bs_\bf_\bs package to provide an\n interface to _\bG_\bo_\bo_\bg_\bl_\be_\b _\bC_\bl_\bo_\bu_\bd_\b _\bS_\bt_\bo_\br_\ba_\bg_\be.\n General _\bf_\bs_\bs_\bp_\be_\bc URLs, those that begin with s3:// or gcs:// for example, are\n@@ -562,35 +562,35 @@\n \n In [18]: ds = xr.Dataset({\"foo\": (\"x\", dummies)}, coords={\"x\": np.arange(30)})\n \n In [19]: path = \"path/to/directory.zarr\"\n \n # Now we write the metadata without computing any array values\n In [20]: ds.to_zarr(path, compute=False)\n-Out[20]: Delayed('_finalize_store-f2e66743-f1e1-4c23-b89d-bab2eaa7f2d5')\n+Out[20]: Delayed('_finalize_store-c22c6ddf-8fb6-4934-ab75-c108e6108f08')\n Now, a Zarr store with the correct variable shapes and attributes exists that\n can be filled out by subsequent calls to to_zarr. Setting region=\"auto\" will\n open the existing store and determine the correct alignment of the new data\n with the existing dimensions, or as an explicit mapping from dimension names to\n Python slice objects indicating where the data should be written (in index\n space, not label space), e.g.,\n # For convenience, we'll slice a single dataset, but in the real use-case\n # we would create them separately possibly even from separate processes.\n In [21]: ds = xr.Dataset({\"foo\": (\"x\", np.arange(30))}, coords={\"x\": np.arange\n (30)})\n \n # Any of the following region specifications are valid\n In [22]: ds.isel(x=slice(0, 10)).to_zarr(path, region=\"auto\")\n-Out[22]: \n+Out[22]: \n \n In [23]: ds.isel(x=slice(10, 20)).to_zarr(path, region={\"x\": \"auto\"})\n-Out[23]: \n+Out[23]: \n \n In [24]: ds.isel(x=slice(20, 30)).to_zarr(path, region={\"x\": slice(20, 30)})\n-Out[24]: \n+Out[24]: \n Concurrent writes with region are safe as long as they modify distinct chunks\n in the underlying Zarr arrays (or use an appropriate lock).\n As a safety check to make it harder to inadvertently override existing values,\n if you set region then a\bal\bll\bl variables included in a Dataset must have dimensions\n included in region. Other variables (typically coordinates) need to be\n explicitly dropped and/or written in a separate calls to to_zarr with mode='a'.\n *\b**\b**\b**\b* Z\bZa\bar\brr\br C\bCo\bom\bmp\bpr\bre\bes\bss\bso\bor\brs\bs a\ban\bnd\bd F\bFi\bil\blt\bte\ber\brs\bs_\b?\b\u00b6 *\b**\b**\b**\b*\n@@ -636,28 +636,28 @@\n ....: \"y\": [1, 2, 3, 4, 5],\n ....: \"t\": pd.date_range(\"2001-01-01\", periods=2),\n ....: },\n ....: )\n ....:\n \n In [30]: ds1.to_zarr(\"path/to/directory.zarr\")\n-Out[30]: \n+Out[30]: \n \n In [31]: ds2 = xr.Dataset(\n ....: {\"foo\": ((\"x\", \"y\", \"t\"), np.random.rand(4, 5, 2))},\n ....: coords={\n ....: \"x\": [10, 20, 30, 40],\n ....: \"y\": [1, 2, 3, 4, 5],\n ....: \"t\": pd.date_range(\"2001-01-03\", periods=2),\n ....: },\n ....: )\n ....:\n \n In [32]: ds2.to_zarr(\"path/to/directory.zarr\", append_dim=\"t\")\n-Out[32]: \n+Out[32]: \n *\b**\b**\b**\b* S\bSp\bpe\bec\bci\bif\bfy\byi\bin\bng\bg c\bch\bhu\bun\bnk\bks\bs i\bin\bn a\ba z\bza\bar\brr\br s\bst\bto\bor\bre\be_\b?\b\u00b6 *\b**\b**\b**\b*\n Chunk sizes may be specified in one of three ways when writing to a zarr store:\n 1. Manual chunk sizing through the use of the encoding argument in\n Dataset.to_zarr():\n 2. Automatic chunking based on chunks in dask arrays\n 3. Default chunk behavior determined by the zarr library\n The resulting chunks will be determined based on the order of the above list;\n@@ -678,15 +678,15 @@\n For example, let\u2019s say we\u2019re working with a dataset with dimensions ('time',\n 'x', 'y'), a variable Tair which is chunked in x and y, and two multi-\n dimensional coordinates xc and yc:\n In [33]: ds = xr.tutorial.open_dataset(\"rasm\")\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/rasm.nc (Caused by\n NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1b4edaee90>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n In [34]: ds[\"Tair\"] = ds[\"Tair\"].chunk({\"x\": 100, \"y\": 100})\n KeyError: \"No variable named 'Tair'. Variables on the dataset include ['foo',\n 'x']\"\n \n@@ -699,15 +699,15 @@\n * x (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29\n Data variables:\n foo (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29\n These multi-dimensional coordinates are only two-dimensional and take up very\n little space on disk or in memory, yet when writing to disk the default zarr\n behavior is to split them into chunks:\n In [36]: ds.to_zarr(\"path/to/directory.zarr\", mode=\"w\")\n-Out[36]: \n+Out[36]: \n \n In [37]: ! ls -R path/to/directory.zarr\n path/to/directory.zarr:\n foo x\tzarr.json\n \n path/to/directory.zarr/foo:\n c zarr.json\n@@ -874,15 +874,15 @@\n provide a more \u201ccorrect\u201d translation between them, but still with very low\n overhead and not using actual disk files.\n For example:\n In [48]: ds = xr.tutorial.open_dataset(\"air_temperature_gradient\")\n ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries\n exceeded with url: /pydata/xarray-data/raw/master/air_temperature_gradient.nc\n (Caused by NameResolutionError(\": Failed to resolve 'github.com' ([Errno -3] Temporary failure\n+0x7f1ba4334550>: Failed to resolve 'github.com' ([Errno -3] Temporary failure\n in name resolution)\"))\n \n \n In [49]: cubes = ncdata.iris_xarray.cubes_from_xarray(ds)\n NameError: name 'ncdata' is not defined\n \n \n"}]}, {"source1": "./usr/share/doc/python-xarray-doc/html/user-guide/plotting.html", "source2": "./usr/share/doc/python-xarray-doc/html/user-guide/plotting.html", "unified_diff": "@@ -100,15 +100,15 @@\n In [3]: import matplotlib.pyplot as plt\n \n In [4]: import xarray as xr\n
\n \n For these examples we\u2019ll use the North American air temperature dataset.
\n In [5]: airtemps = xr.tutorial.open_dataset("air_temperature")\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9d71bdec10>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1ba4337890>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [6]: airtemps\n NameError: name 'airtemps' is not defined\n \n \n # Convert to celsius\n@@ -445,15 +445,15 @@\n \n # Apply a nonlinear transformation to one of the coords\n In [50]: b.coords["lat"] = np.log(b.coords["lat"])\n KeyError: 'lat'\n \n \n In [51]: b.plot()\n-Out[51]: [<matplotlib.lines.Line2D at 0x7f9dc595c2d0>]\n+Out[51]: [<matplotlib.lines.Line2D at 0x7f1ba3bbf390>]\n
\n \n
\n \n \n \n Other types of plot\u00b6
\n@@ -857,117 +857,117 @@\n * y (y) float64 88B 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0\n * z (z) int64 32B 0 1 2 3\n * w (w) <U5 80B 'one' 'two' 'three' 'five'\n Attributes:\n units: Aunits\n \n In [99]: ds.A.plot.scatter(x="y")\n-Out[99]: <matplotlib.collections.PathCollection at 0x7f9dc59ab4d0>\n+Out[99]: <matplotlib.collections.PathCollection at 0x7f1b4ed4c830>\n
Same plot can be displayed using the dataset:
\nIn [100]: ds.plot.scatter(x="y", y="A")\n-Out[100]: <matplotlib.collections.PathCollection at 0x7f9dc5867750>\n+Out[100]: <matplotlib.collections.PathCollection at 0x7f1ba3c85a90>\n
Now suppose we want to scatter the A
DataArray against the B
DataArray
In [101]: ds.plot.scatter(x="A", y="B")\n-Out[101]: <matplotlib.collections.PathCollection at 0x7f9dc593fc50>\n+Out[101]: <matplotlib.collections.PathCollection at 0x7f1ba3ab6710>\n
The hue
kwarg lets you vary the color by variable value
In [102]: ds.plot.scatter(x="A", y="B", hue="w")\n-Out[102]: <matplotlib.collections.PathCollection at 0x7f9dc583dd10>\n+Out[102]: <matplotlib.collections.PathCollection at 0x7f1b4edaed50>\n
You can force a legend instead of a colorbar by setting add_legend=True, add_colorbar=False
.
In [103]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=True, add_colorbar=False)\n-Out[103]: <matplotlib.collections.PathCollection at 0x7f9d83ca11d0>\n+Out[103]: <matplotlib.collections.PathCollection at 0x7f1b6cf416d0>\n
In [104]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=False, add_colorbar=True)\n-Out[104]: <matplotlib.collections.PathCollection at 0x7f9d83ca8050>\n+Out[104]: <matplotlib.collections.PathCollection at 0x7f1b6d1d6c10>\n
The markersize
kwarg lets you vary the point\u2019s size by variable value.\n You can additionally pass size_norm
to control how the variable\u2019s values are mapped to point sizes.
In [105]: ds.plot.scatter(x="A", y="B", hue="y", markersize="z")\n-Out[105]: <matplotlib.collections.PathCollection at 0x7f9d72adf390>\n+Out[105]: <matplotlib.collections.PathCollection at 0x7f1ba3ab6fd0>\n
The z
kwarg lets you plot the data along the z-axis as well.
In [106]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x")\n-Out[106]: <mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7f9dc5865d10>\n+Out[106]: <mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7f1ba3c87c50>\n
Faceting is also possible
\nIn [107]: ds.plot.scatter(x="A", y="B", hue="y", markersize="x", row="x", col="w")\n-Out[107]: <xarray.plot.facetgrid.FacetGrid at 0x7f9d71940980>\n+Out[107]: <xarray.plot.facetgrid.FacetGrid at 0x7f1b4ed4cec0>\n
And adding the z-axis
\nIn [108]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x", row="x", col="w")\n-Out[108]: <xarray.plot.facetgrid.FacetGrid at 0x7f9dc4fb4910>\n+Out[108]: <xarray.plot.facetgrid.FacetGrid at 0x7f1ba33d3610>\n
For more advanced scatter plots, we recommend converting the relevant data variables\n to a pandas DataFrame and using the extensive plotting capabilities of seaborn
.
Visualizing vector fields is supported with quiver plots:
\nIn [109]: ds.isel(w=1, z=1).plot.quiver(x="x", y="y", u="A", v="B")\n-Out[109]: <matplotlib.quiver.Quiver at 0x7f9d715c6900>\n+Out[109]: <matplotlib.quiver.Quiver at 0x7f1b4e9ac980>\n
where u
and v
denote the x and y direction components of the arrow vectors. Again, faceting is also possible:
In [110]: ds.plot.quiver(x="x", y="y", u="A", v="B", col="w", row="z", scale=4)\n-Out[110]: <xarray.plot.facetgrid.FacetGrid at 0x7f9dc4de56d0>\n+Out[110]: <xarray.plot.facetgrid.FacetGrid at 0x7f1ba32156d0>\n
scale
is required for faceted quiver plots.\n The scale determines the number of data units per arrow length unit, i.e. a smaller scale parameter makes the arrow longer.
Visualizing vector fields is also supported with streamline plots:
\nIn [111]: ds.isel(w=1, z=1).plot.streamplot(x="x", y="y", u="A", v="B")\n-Out[111]: <matplotlib.collections.LineCollection at 0x7f9dc4946c10>\n+Out[111]: <matplotlib.collections.LineCollection at 0x7f1ba2d5dbd0>\n
where u
and v
denote the x and y direction components of the vectors tangent to the streamlines.\n Again, faceting is also possible:
In [112]: ds.plot.streamplot(x="x", y="y", u="A", v="B", col="w", row="z")\n-Out[112]: <xarray.plot.facetgrid.FacetGrid at 0x7f9d71b19810>\n+Out[112]: <xarray.plot.facetgrid.FacetGrid at 0x7f1b4eced0f0>\n
To follow this section you\u2019ll need to have Cartopy installed and working.
\nThis script will plot the air temperature on a map.
\nIn [113]: import cartopy.crs as ccrs\n \n In [114]: air = xr.tutorial.open_dataset("air_temperature").air\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9dc49cead0>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1ba2770550>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [115]: p = air.isel(time=0).plot(\n .....: subplot_kws=dict(projection=ccrs.Orthographic(-80, 35), facecolor="gray"),\n .....: transform=ccrs.PlateCarree(),\n .....: )\n .....: \n@@ -1024,24 +1024,24 @@\n In [121]: import xarray.plot as xplt\n \n In [122]: da = xr.DataArray(range(5))\n \n In [123]: fig, axs = plt.subplots(ncols=2, nrows=2)\n \n In [124]: da.plot(ax=axs[0, 0])\n-Out[124]: [<matplotlib.lines.Line2D at 0x7f9dc4490e10>]\n+Out[124]: [<matplotlib.lines.Line2D at 0x7f1ba2836210>]\n \n In [125]: da.plot.line(ax=axs[0, 1])\n-Out[125]: [<matplotlib.lines.Line2D at 0x7f9dc4490f50>]\n+Out[125]: [<matplotlib.lines.Line2D at 0x7f1ba2836350>]\n \n In [126]: xplt.plot(da, ax=axs[1, 0])\n-Out[126]: [<matplotlib.lines.Line2D at 0x7f9dc4491090>]\n+Out[126]: [<matplotlib.lines.Line2D at 0x7f1ba2836490>]\n \n In [127]: xplt.line(da, ax=axs[1, 1])\n-Out[127]: [<matplotlib.lines.Line2D at 0x7f9dc44911d0>]\n+Out[127]: [<matplotlib.lines.Line2D at 0x7f1ba28365d0>]\n \n In [128]: plt.tight_layout()\n \n In [129]: plt.draw()\n
\n \n
\n@@ -1091,15 +1091,15 @@\n
The plot will produce an image corresponding to the values of the array.\n Hence the top left pixel will be a different color than the others.\n Before reading on, you may want to look at the coordinates and\n think carefully about what the limits, labels, and orientation for\n each of the axes should be.
\nIn [134]: a.plot()\n-Out[134]: <matplotlib.collections.QuadMesh at 0x7f9dc457ae90>\n+Out[134]: <matplotlib.collections.QuadMesh at 0x7f1ba2961590>\n
It may seem strange that\n the values on the y axis are decreasing with -0.5 on the top. This is because\n the pixels are centered over their coordinates, and the\n@@ -1122,57 +1122,57 @@\n .....: np.arange(20).reshape(4, 5),\n .....: dims=["y", "x"],\n .....: coords={"lat": (("y", "x"), lat), "lon": (("y", "x"), lon)},\n .....: )\n .....: \n \n In [139]: da.plot.pcolormesh(x="lon", y="lat")\n-Out[139]: <matplotlib.collections.QuadMesh at 0x7f9dc3fd9590>\n+Out[139]: <matplotlib.collections.QuadMesh at 0x7f1ba23e91d0>\n
Note that in this case, xarray still follows the pixel centered convention.\n This might be undesirable in some cases, for example when your data is defined\n on a polar projection (GH781). This is why the default is to not follow\n this convention when plotting on a map:
\nIn [140]: import cartopy.crs as ccrs\n \n In [141]: ax = plt.subplot(projection=ccrs.PlateCarree())\n \n In [142]: da.plot.pcolormesh(x="lon", y="lat", ax=ax)\n-Out[142]: <cartopy.mpl.geocollection.GeoQuadMesh at 0x7f9dc43de710>\n+Out[142]: <cartopy.mpl.geocollection.GeoQuadMesh at 0x7f1ba27d3110>\n \n In [143]: ax.scatter(lon, lat, transform=ccrs.PlateCarree())\n-Out[143]: <matplotlib.collections.PathCollection at 0x7f9dc3ffb890>\n+Out[143]: <matplotlib.collections.PathCollection at 0x7f1ba2836e90>\n \n In [144]: ax.coastlines()\n-Out[144]: <cartopy.mpl.feature_artist.FeatureArtist at 0x7f9d715c6f90>\n+Out[144]: <cartopy.mpl.feature_artist.FeatureArtist at 0x7f1b4e9ac1a0>\n \n In [145]: ax.gridlines(draw_labels=True)\n-Out[145]: <cartopy.mpl.gridliner.Gridliner at 0x7f9d715c4830>\n+Out[145]: <cartopy.mpl.gridliner.Gridliner at 0x7f1b4e9ac590>\n
You can however decide to infer the cell boundaries and use the\n infer_intervals
keyword:
In [146]: ax = plt.subplot(projection=ccrs.PlateCarree())\n \n In [147]: da.plot.pcolormesh(x="lon", y="lat", ax=ax, infer_intervals=True)\n-Out[147]: <cartopy.mpl.geocollection.GeoQuadMesh at 0x7f9dc450f390>\n+Out[147]: <cartopy.mpl.geocollection.GeoQuadMesh at 0x7f1ba3891bd0>\n \n In [148]: ax.scatter(lon, lat, transform=ccrs.PlateCarree())\n-Out[148]: <matplotlib.collections.PathCollection at 0x7f9dc4140910>\n+Out[148]: <matplotlib.collections.PathCollection at 0x7f1ba31191d0>\n \n In [149]: ax.coastlines()\n-Out[149]: <cartopy.mpl.feature_artist.FeatureArtist at 0x7f9dc41407d0>\n+Out[149]: <cartopy.mpl.feature_artist.FeatureArtist at 0x7f1ba3119950>\n \n In [150]: ax.gridlines(draw_labels=True)\n-Out[150]: <cartopy.mpl.gridliner.Gridliner at 0x7f9dc4140690>\n+Out[150]: <cartopy.mpl.gridliner.Gridliner at 0x7f1ba31187d0>\n
Note
\nThe data model of xarray does not support datasets with cell boundaries\n@@ -1180,26 +1180,26 @@\n outside the xarray framework.
\nOne can also make line plots with multidimensional coordinates. In this case, hue
must be a dimension name, not a coordinate name.
In [151]: f, ax = plt.subplots(2, 1)\n \n In [152]: da.plot.line(x="lon", hue="y", ax=ax[0])\n Out[152]: \n-[<matplotlib.lines.Line2D at 0x7f9dc40e2350>,\n- <matplotlib.lines.Line2D at 0x7f9dc40e2210>,\n- <matplotlib.lines.Line2D at 0x7f9dc40e20d0>,\n- <matplotlib.lines.Line2D at 0x7f9dc40e2710>]\n+[<matplotlib.lines.Line2D at 0x7f1ba2f5df90>,\n+ <matplotlib.lines.Line2D at 0x7f1ba2f5e5d0>,\n+ <matplotlib.lines.Line2D at 0x7f1ba2f5e350>,\n+ <matplotlib.lines.Line2D at 0x7f1ba2f5e0d0>]\n \n In [153]: da.plot.line(x="lon", hue="x", ax=ax[1])\n Out[153]: \n-[<matplotlib.lines.Line2D at 0x7f9dc4b33390>,\n- <matplotlib.lines.Line2D at 0x7f9dc4b339d0>,\n- <matplotlib.lines.Line2D at 0x7f9dc4b33890>,\n- <matplotlib.lines.Line2D at 0x7f9dc4b33750>,\n- <matplotlib.lines.Line2D at 0x7f9dc4b33610>]\n+[<matplotlib.lines.Line2D at 0x7f1ba24b51d0>,\n+ <matplotlib.lines.Line2D at 0x7f1ba24b5090>,\n+ <matplotlib.lines.Line2D at 0x7f1ba24b4f50>,\n+ <matplotlib.lines.Line2D at 0x7f1ba24b4e10>,\n+ <matplotlib.lines.Line2D at 0x7f1ba24b4cd0>]\n
Whilst coarsen
is normally used for reducing your data\u2019s resolution by applying a reduction function\n (see the page on computation),\n it can also be used to reorganise your data without applying a computation via construct()
.
Taking our example tutorial air temperature dataset over the Northern US
\nIn [56]: air = xr.tutorial.open_dataset("air_temperature")["air"]\n-ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9dc40e1590>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n+ConnectionError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /pydata/xarray-data/raw/master/air_temperature.nc (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f1ba2f5ca50>: Failed to resolve 'github.com' ([Errno -3] Temporary failure in name resolution)"))\n \n \n In [57]: air.isel(time=0).plot(x="lon", y="lat")\n NameError: name 'air' is not defined\n
To see an example of what each of these strategies might produce, you can call one followed by the .example()
method,\n which is a general hypothesis method valid for all strategies.
In [2]: import xarray.testing.strategies as xrst\n \n In [3]: xrst.variables().example()\n Out[3]: \n-<xarray.Variable (\u017e\u00f6\u017e\u012a\u0105: 4, \u017e\u0106\u016a: 3, \u013b\u013aU: 6)> Size: 576B\n-array([[[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, 0.000e+00 +nanj,\n- -1.175e-38+1.100e+00j, -0.000e+00+1.175e-38j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[ -inf+6.894e+16j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -1.792e+16+5.000e-01j, -0.000e+00-0.000e+00j],\n- [ -inf -infj, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, 6.320e+16 +infj, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, nan+2.000e+00j,\n- -3.333e-01+3.932e+16j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -5.000e-01 +infj, -6.467e+16-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00 +nanj, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- nan+2.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- 2.000e+00 -infj, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00 -infj, nan+0.000e+00j, -0.000e+00 +infj,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]]],\n- shape=(4, 3, 6), dtype=complex64)\n+<xarray.Variable (\u00d5\u00e7\u00da\u00df: 4, 4\u0136\u0106\u017c: 4)> Size: 256B\n+array([[ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.175e-038 -infj,\n+ 1.019e-261+6.364e-63j],\n+ [ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j],\n+ [ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j],\n+ [-2.225e-309-0.000e+00j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j]], shape=(4, 4))\n+Attributes:\n+ \u0155\u00bd\u0110\u0175z: True\n+ \u00d6: None\n+ \u0152\u00f9\u017e\u010e\u00f1: None\n+ \u017e\u0114zsM: [b'qq' b'']\n+ i\u0107\u00d23\u00fb: ['(' 'Y']\n+ : True\n+ \u00e2\u0103: [ '126308514-07-25T09:51:52.375' '-292275055-06-28T02:15:45.511']\n+ \u00b5: False\n \n In [4]: xrst.variables().example()\n Out[4]: \n-<xarray.Variable (\u017f: 3, \u00d0\u017bk: 3)> Size: 18B\n-array([[ 6.104e-05, -5.960e-08, 1.192e-07],\n- [ inf, inf, -0.000e+00],\n- [ 0.000e+00, 0.000e+00, 2.000e+00]], dtype=float16)\n+<xarray.Variable (\u00e9\u0160\u00c2\u00e14: 4, \u017d\u014b: 3)> Size: 48B\n+array([[ 25, 40530, 17896],\n+ [ 45339, 1086556200, 140],\n+ [ 244, 62914, 2817231010],\n+ [ 41677, 38948, 36486]], shape=(4, 3), dtype=uint32)\n Attributes:\n- \u0105\u017b\u0143\u017f9: False\n- NaN: None\n- \u00bd: [-128 -29]\n+ \u017d: False\n+ : \u00ed\u010a\n \n In [5]: xrst.variables().example()\n Out[5]: \n-<xarray.Variable (\u013d: 5)> Size: 5B\n-array([-127, -119, 105, 59, 121], dtype=int8)\n-Attributes:\n- \u0135\u012f7q\u017f: {'\u0148P\u00fa': array([b'\\xe7\\n\\xe3A2\\r0\\xc0'], dtype='|S10'), '\u0157\u017f': ar...\n+<xarray.Variable (0: 1)> Size: 1B\n+array([0], dtype=int8)\n
You can see that calling .example()
multiple times will generate different examples, giving you an idea of the wide\n range of data that the xarray strategies can generate.
In your tests however you should not use .example()
- instead you should parameterize your tests with the\n hypothesis.given()
decorator:
In [6]: from hypothesis import given\n@@ -156,84 +143,66 @@\n Xarray\u2019s strategies can accept other strategies as arguments, allowing you to customise the contents of the generated\n examples.
\n # generate a Variable containing an array with a complex number dtype, but all other details still arbitrary\n In [8]: from hypothesis.extra.numpy import complex_number_dtypes\n \n In [9]: xrst.variables(dtype=complex_number_dtypes()).example()\n Out[9]: \n-<xarray.Variable (\u0170\u017eL\u00e1\u017b: 6)> Size: 96B\n-array([-2.900e-092-3.403e+038j, -3.046e+183 -infj, -1.000e-005-1.390e+137j,\n- -1.175e-038+1.900e+000j, -inf+1.175e-038j, 2.225e-311-4.592e-244j], dtype='>c16')\n-Attributes:\n- \u00dd: None\n- \u0166\u0115h\u017b\u017e: [41024]\n- \u00f8\u00cd\u0164\u0133\u00e8: [-41]\n- \u00bd\u0174db\u00b2: None\n- \u00fd: H\u00eca\u00df\u00fd\n- \u015f\u00b3\u00e4\u0110: True\n- \u0118\u017b6tp: [[b'\\x1a5f\\xbf' b'\\xba']]\n- : True\n+<xarray.Variable (\u0133\u016e\u00dc\u017e\u00b3: 4)> Size: 32B\n+array([ 0.000e+00-2.22e-16j, -1.192e-07-0.00e+00j, -1.401e-45+0.00e+00j, nan+0.00e+00j],\n+ dtype='>c8')\n
\n \n This also works with custom strategies, or strategies defined in other packages.\n For example you could imagine creating a chunks
strategy to specify particular chunking patterns for a dask-backed array.
\n \n \n Fixing Arguments\u00b6
\n If you want to fix one aspect of the data structure, whilst allowing variation in the generated examples\n over all other aspects, then use hypothesis.strategies.just()
.
\n In [10]: import hypothesis.strategies as st\n \n # Generates only variable objects with dimensions ["x", "y"]\n In [11]: xrst.variables(dims=st.just(["x", "y"])).example()\n Out[11]: \n-<xarray.Variable (x: 6, y: 3)> Size: 18B\n-array([[ 28, 235, 10],\n- [ 10, 194, 187],\n- [ 19, 153, 185],\n- [ 84, 162, 10],\n- [ 10, 240, 4],\n- [ 10, 10, 251]], shape=(6, 3), dtype=uint8)\n-Attributes:\n- : True\n- c\u0126: True\n- \u00facA\u017e\u00b9: None\n- \u016c\u014d\u013a: ['\u00b6\\x03a\\U000f775c{\\x05']\n- J: False\n- Gm\u0160\u0149\u0148: F\u0114\u0149\u017c\u017d\n- \u017dj\u00eb\u017c: False\n- \u00fb\u017c\u017b\u017d\u017c: True\n- \u010b6: None\n- \u00e3\u010c\u0135\u0179\u0169: [b'6m\\xb2rX\\x88\\xfa' b'']\n- \u017b\u017e7\u017f\u017e: False\n+<xarray.Variable (x: 1, y: 1)> Size: 8B\n+array([[0.+0.j]], dtype=complex64)\n
\n \n (This is technically another example of chaining strategies - hypothesis.strategies.just()
is simply a\n special strategy that just contains a single example.)
\n To fix the length of dimensions you can instead pass dims
as a mapping of dimension names to lengths\n (i.e. following xarray objects\u2019 .sizes()
property), e.g.
\n # Generates only variables with dimensions ["x", "y"], of lengths 2 & 3 respectively\n In [12]: xrst.variables(dims=st.just({"x": 2, "y": 3})).example()\n Out[12]: \n-<xarray.Variable (x: 2, y: 3)> Size: 48B\n-array([[-2692105329957446195, -2692105329957446195, -2692105329957446195],\n- [-2692105329957446195, -2692105329957446195, -2692105329957446195]])\n+<xarray.Variable (x: 2, y: 3)> Size: 96B\n+array([[-1.567e+016-2.225e-308j, -3.403e+038+8.650e+023j, -1.175e-038+4.941e-324j],\n+ [ inf-1.500e+000j, -1.113e-308+6.104e-005j, 4.885e+016 +nanj]])\n Attributes:\n- 2\u0152\u017e\u014b\u017b: \u016b\n- \u017f\u0171: False\n- \u016e\u0131D\u00fb: None\n- \u0152\u00c5: True\n+ \u0163: \n+ \u017e\u010d\u0128\u017f\u011e: True\n+ \u016d\u00de\u017e: None\n+ \u0153\u0126AU\u017c: True\n+ 0\u0162: \u00bc\u00df\u017d\u00b5\u017e\n+ \u00feA\u014f\u0141\u014d: False\n+ \u017d: [[-23057191]]\n+ \u017f: None\n+ \u015f\u0108\u00de: \u0141\u0171\u0172\u0109b\n+ : \u016a\u0122J\u017f\u013d\n+ U\u0168: [['\\U000dd64d\\x9dv\\x0f' '\\U000dd64d\\x9dv\\x0f']]\n+ \u010dCC\u017e: S\n
\n \n You can also use this to specify that you want examples which are missing some part of the data structure, for instance
\n # Generates a Variable with no attributes\n In [13]: xrst.variables(attrs=st.just({})).example()\n Out[13]: \n-<xarray.Variable (c\u00df: 1)> Size: 8B\n-array([25404], dtype=uint64)\n+<xarray.Variable (\u017d\u017b\u017f\u00e6: 3)> Size: 24B\n+array([9223372036854775806, 9223372036854775806, 9223372036854775806])\n
\n \n Through a combination of chaining strategies and fixing arguments, you can specify quite complicated requirements on the\n objects your chained strategy will generate.
\n In [14]: fixed_x_variable_y_maybe_z = st.fixed_dictionaries(\n ....: {"x": st.just(2), "y": st.integers(3, 4)}, optional={"z": st.just(2)}\n ....: )\n@@ -242,28 +211,26 @@\n In [15]: fixed_x_variable_y_maybe_z.example()\n Out[15]: {'x': 2, 'y': 4}\n \n In [16]: special_variables = xrst.variables(dims=fixed_x_variable_y_maybe_z)\n \n In [17]: special_variables.example()\n Out[17]: \n-<xarray.Variable (x: 2, y: 3, z: 2)> Size: 48B\n-array([[[ inf, -inf],\n- [-1.100e+00, 6.311e+16],\n- [ 0.000e+00, inf]],\n-\n- [[ 1.175e-38, nan],\n- [ 1.500e+00, nan],\n- [-0.000e+00, nan]]], shape=(2, 3, 2), dtype=float32)\n+<xarray.Variable (x: 2, y: 3)> Size: 12B\n+array([[0., 0., 0.],\n+ [0., 0., 0.]], dtype=float16)\n \n In [18]: special_variables.example()\n Out[18]: \n-<xarray.Variable (x: 2, y: 4)> Size: 64B\n-array([[ 29, 29, 29, 29],\n- [38745, 29, 29, 29]], dtype=uint64)\n+<xarray.Variable (x: 2, y: 3)> Size: 24B\n+array([[ 9.007e+15, -6.104e-05, 1.100e+00],\n+ [-1.100e+00, -1.417e+16, -5.960e-08]], dtype=float32)\n+Attributes:\n+ 9\u017b: \u017b\n+ \u017e8\u00e4\u010b\u0166: None\n
\n \n Here we have used one of hypothesis\u2019 built-in strategies hypothesis.strategies.fixed_dictionaries()
to create a\n strategy which generates mappings of dimension names to lengths (i.e. the size
of the xarray object we want).\n This particular strategy will always generate an x
dimension of length 2, and a y
dimension of\n length either 3 or 4, and will sometimes also generate a z
dimension of length 2.\n By feeding this strategy for dictionaries into the dims
argument of xarray\u2019s variables()
strategy,\n@@ -364,43 +331,43 @@\n ....: array_strategy_fn=xps.arrays,\n ....: dtype=xps.scalar_dtypes(),\n ....: )\n ....: \n \n In [32]: xp_variables.example()\n Out[32]: \n-<xarray.Variable (null: 4)> Size: 4B\n-array([21, 59, 62, 50], dtype=int8)\n+<xarray.Variable (\u010e\u0155\u00f1\u013d: 4)> Size: 4B\n+array([False, True, True, False])\n
Another array API-compliant duck array library would replace the import, e.g. import cupy as cp
instead.
A common task when testing xarray user code is checking that your function works for all valid input dimensions.\n We can chain strategies to achieve this, for which the helper strategy unique_subset_of()
\n is useful.
It works for lists of dimension names
\nIn [33]: dims = ["x", "y", "z"]\n \n In [34]: xrst.unique_subset_of(dims).example()\n-Out[34]: []\n+Out[34]: ['z', 'x', 'y']\n \n In [35]: xrst.unique_subset_of(dims).example()\n-Out[35]: ['x']\n+Out[35]: ['y', 'z', 'x']\n
as well as for mappings of dimension names to sizes
\nIn [36]: dim_sizes = {"x": 2, "y": 3, "z": 4}\n \n In [37]: xrst.unique_subset_of(dim_sizes).example()\n-Out[37]: {'y': 3, 'z': 4, 'x': 2}\n+Out[37]: {'y': 3}\n \n In [38]: xrst.unique_subset_of(dim_sizes).example()\n-Out[38]: {'x': 2, 'z': 4, 'y': 3}\n+Out[38]: {'z': 4}\n
This is useful because operations like reductions can be performed over any subset of the xarray object\u2019s dimensions.\n For example we can write a pytest test that tests that a reduction gives the expected result when applying that reduction\n along any possible valid subset of the Variable\u2019s dimensions.
\nimport numpy.testing as npt\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -28,63 +28,48 @@\n To see an example of what each of these strategies might produce, you can call\n one followed by the .example() method, which is a general hypothesis method\n valid for all strategies.\n In [2]: import xarray.testing.strategies as xrst\n \n In [3]: xrst.variables().example()\n Out[3]:\n- Size: 576B\n-array([[[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, 0.000e+00 +nanj,\n- -1.175e-38+1.100e+00j, -0.000e+00+1.175e-38j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[ -inf+6.894e+16j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -1.792e+16+5.000e-01j, -0.000e+00-0.000e+00j],\n- [ -inf -infj, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, 6.320e+16 +infj, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, nan+2.000e+00j,\n- -3.333e-01+3.932e+16j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -5.000e-01 +infj, -6.467e+16-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00 +nanj, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- nan+2.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j]],\n-\n- [[-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- 2.000e+00 -infj, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j],\n- [-0.000e+00 -infj, nan+0.000e+00j, -0.000e+00 +infj,\n- -0.000e+00-0.000e+00j, -0.000e+00-0.000e+00j, -0.000e+00-\n-0.000e+00j]]],\n- shape=(4, 3, 6), dtype=complex64)\n+ Size: 256B\n+array([[ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.175e-038 -infj,\n+ 1.019e-261+6.364e-63j],\n+ [ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j],\n+ [ 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j],\n+ [-2.225e-309-0.000e+00j, 1.019e-261+6.364e-63j, 1.019e-261+6.364e-63j,\n+ 1.019e-261+6.364e-63j]], shape=(4, 4))\n+Attributes:\n+ \u0155\u00bd\u0110\u0175z: True\n+ \u00d6: None\n+ \u0152\u00f9\u017e\u010e\u00f1: None\n+ \u017e\u0114zsM: [b'qq' b'']\n+ i\u0107\u00d23\u00fb: ['(' 'Y']\n+ : True\n+ \u00e2\u0103: [ '126308514-07-25T09:51:52.375' '-292275055-06-28T02:15:45.511']\n+ \u00b5: False\n \n In [4]: xrst.variables().example()\n Out[4]:\n- Size: 18B\n-array([[ 6.104e-05, -5.960e-08, 1.192e-07],\n- [ inf, inf, -0.000e+00],\n- [ 0.000e+00, 0.000e+00, 2.000e+00]], dtype=float16)\n+ Size: 48B\n+array([[ 25, 40530, 17896],\n+ [ 45339, 1086556200, 140],\n+ [ 244, 62914, 2817231010],\n+ [ 41677, 38948, 36486]], shape=(4, 3), dtype=uint32)\n Attributes:\n- \u0105\u017b\u0143\u017f9: False\n- NaN: None\n- \u00bd: [-128 -29]\n+ \u017d: False\n+ : \u00ed\u010a\n \n In [5]: xrst.variables().example()\n Out[5]:\n- Size: 5B\n-array([-127, -119, 105, 59, 121], dtype=int8)\n-Attributes:\n- \u0135\u012f7q\u017f: {'\u0148P\u00fa': array([b'\\xe7\\n\\xe3A2\\r0\\xc0'], dtype='|S10'), '\u0157\u017f':\n-ar...\n+ Size: 1B\n+array([0], dtype=int8)\n You can see that calling .example() multiple times will generate different\n examples, giving you an idea of the wide range of data that the xarray\n strategies can generate.\n In your tests however you should not use .example() - instead you should\n parameterize your tests with the hypothesis.given() decorator:\n In [6]: from hypothesis import given\n In [7]: @given(xrst.variables())\n@@ -96,84 +81,67 @@\n customise the contents of the generated examples.\n # generate a Variable containing an array with a complex number dtype, but all\n other details still arbitrary\n In [8]: from hypothesis.extra.numpy import complex_number_dtypes\n \n In [9]: xrst.variables(dtype=complex_number_dtypes()).example()\n Out[9]:\n- Size: 96B\n-array([-2.900e-092-3.403e+038j, -3.046e+183 -infj, -1.000e-005-\n-1.390e+137j,\n- -1.175e-038+1.900e+000j, -inf+1.175e-038j, 2.225e-311-4.592e-\n-244j], dtype='>c16')\n-Attributes:\n- \u00dd: None\n- \u0166\u0115h\u017b\u017e: [41024]\n- \u00f8\u00cd\u0164\u0133\u00e8: [-41]\n- \u00bd\u0174db\u00b2: None\n- \u00fd: H\u00eca\u00df\u00fd\n- \u015f\u00b3\u00e4\u0110: True\n- \u0118\u017b6tp: [[b'\\x1a5f\\xbf' b'\\xba']]\n- : True\n+ Size: 32B\n+array([ 0.000e+00-2.22e-16j, -1.192e-07-0.00e+00j, -1.401e-45+0.00e+00j,\n+nan+0.00e+00j],\n+ dtype='>c8')\n This also works with custom strategies, or strategies defined in other\n packages. For example you could imagine creating a chunks strategy to specify\n particular chunking patterns for a dask-backed array.\n *\b**\b**\b**\b* F\bFi\bix\bxi\bin\bng\bg A\bAr\brg\bgu\bum\bme\ben\bnt\bts\bs_\b?\b\u00b6 *\b**\b**\b**\b*\n If you want to fix one aspect of the data structure, whilst allowing variation\n in the generated examples over all other aspects, then use\n hypothesis.strategies.just().\n In [10]: import hypothesis.strategies as st\n \n # Generates only variable objects with dimensions [\"x\", \"y\"]\n In [11]: xrst.variables(dims=st.just([\"x\", \"y\"])).example()\n Out[11]:\n- Size: 18B\n-array([[ 28, 235, 10],\n- [ 10, 194, 187],\n- [ 19, 153, 185],\n- [ 84, 162, 10],\n- [ 10, 240, 4],\n- [ 10, 10, 251]], shape=(6, 3), dtype=uint8)\n-Attributes:\n- : True\n- c\u0126: True\n- \u00facA\u017e\u00b9: None\n- \u016c\u014d\u013a: ['\u00b6\\x03a\\U000f775c{\\x05']\n- J: False\n- Gm\u0160\u0149\u0148: F\u0114\u0149\u017c\u017d\n- \u017dj\u00eb\u017c: False\n- \u00fb\u017c\u017b\u017d\u017c: True\n- \u010b6: None\n- \u00e3\u010c\u0135\u0179\u0169: [b'6m\\xb2rX\\x88\\xfa' b'']\n- \u017b\u017e7\u017f\u017e: False\n+ Size: 8B\n+array([[0.+0.j]], dtype=complex64)\n (This is technically another example of chaining strategies -\n hypothesis.strategies.just() is simply a special strategy that just contains a\n single example.)\n To fix the length of dimensions you can instead pass dims as a mapping of\n dimension names to lengths (i.e. following xarray objects\u2019 .sizes() property),\n e.g.\n # Generates only variables with dimensions [\"x\", \"y\"], of lengths 2 & 3\n respectively\n In [12]: xrst.variables(dims=st.just({\"x\": 2, \"y\": 3})).example()\n Out[12]:\n- Size: 48B\n-array([[-2692105329957446195, -2692105329957446195, -2692105329957446195],\n- [-2692105329957446195, -2692105329957446195, -2692105329957446195]])\n+ Size: 96B\n+array([[-1.567e+016-2.225e-308j, -3.403e+038+8.650e+023j, -1.175e-038+4.941e-\n+324j],\n+ [ inf-1.500e+000j, -1.113e-308+6.104e-005j, 4.885e+016\n++nanj]])\n Attributes:\n- 2\u0152\u017e\u014b\u017b: \u016b\n- \u017f\u0171: False\n- \u016e\u0131D\u00fb: None\n- \u0152\u00c5: True\n+ \u0163:\n+ \u017e\u010d\u0128\u017f\u011e: True\n+ \u016d\u00de\u017e: None\n+ \u0153\u0126AU\u017c: True\n+ 0\u0162: \u00bc\u00df\u017d\u00b5\u017e\n+ \u00feA\u014f\u0141\u014d: False\n+ \u017d: [[-23057191]]\n+ \u017f: None\n+ \u015f\u0108\u00de: \u0141\u0171\u0172\u0109b\n+ : \u016a\u0122J\u017f\u013d\n+ U\u0168: [['\\U000dd64d\\x9dv\\x0f' '\\U000dd64d\\x9dv\\x0f']]\n+ \u010dCC\u017e: S\n You can also use this to specify that you want examples which are missing some\n part of the data structure, for instance\n # Generates a Variable with no attributes\n In [13]: xrst.variables(attrs=st.just({})).example()\n Out[13]:\n- Size: 8B\n-array([25404], dtype=uint64)\n+ Size: 24B\n+array([9223372036854775806, 9223372036854775806, 9223372036854775806])\n Through a combination of chaining strategies and fixing arguments, you can\n specify quite complicated requirements on the objects your chained strategy\n will generate.\n In [14]: fixed_x_variable_y_maybe_z = st.fixed_dictionaries(\n ....: {\"x\": st.just(2), \"y\": st.integers(3, 4)}, optional={\"z\": st.just\n (2)}\n ....: )\n@@ -182,28 +150,26 @@\n In [15]: fixed_x_variable_y_maybe_z.example()\n Out[15]: {'x': 2, 'y': 4}\n \n In [16]: special_variables = xrst.variables(dims=fixed_x_variable_y_maybe_z)\n \n In [17]: special_variables.example()\n Out[17]:\n- Size: 48B\n-array([[[ inf, -inf],\n- [-1.100e+00, 6.311e+16],\n- [ 0.000e+00, inf]],\n-\n- [[ 1.175e-38, nan],\n- [ 1.500e+00, nan],\n- [-0.000e+00, nan]]], shape=(2, 3, 2), dtype=float32)\n+ Size: 12B\n+array([[0., 0., 0.],\n+ [0., 0., 0.]], dtype=float16)\n \n In [18]: special_variables.example()\n Out[18]:\n- Size: 64B\n-array([[ 29, 29, 29, 29],\n- [38745, 29, 29, 29]], dtype=uint64)\n+ Size: 24B\n+array([[ 9.007e+15, -6.104e-05, 1.100e+00],\n+ [-1.100e+00, -1.417e+16, -5.960e-08]], dtype=float32)\n+Attributes:\n+ 9\u017b: \u017b\n+ \u017e8\u00e4\u010b\u0166: None\n Here we have used one of hypothesis\u2019 built-in strategies\n hypothesis.strategies.fixed_dictionaries() to create a strategy which generates\n mappings of dimension names to lengths (i.e. the size of the xarray object we\n want). This particular strategy will always generate an x dimension of length\n 2, and a y dimension of length either 3 or 4, and will sometimes also generate\n a z dimension of length 2. By feeding this strategy for dictionaries into the\n dims argument of xarray\u2019s variables() strategy, we can generate arbitrary\n@@ -297,38 +263,38 @@\n ....: array_strategy_fn=xps.arrays,\n ....: dtype=xps.scalar_dtypes(),\n ....: )\n ....:\n \n In [32]: xp_variables.example()\n Out[32]:\n- Size: 4B\n-array([21, 59, 62, 50], dtype=int8)\n+ Size: 4B\n+array([False, True, True, False])\n Another array API-compliant duck array library would replace the import, e.g.\n import cupy as cp instead.\n *\b**\b**\b**\b* T\bTe\bes\bst\bti\bin\bng\bg o\bov\bve\ber\br S\bSu\bub\bbs\bse\bet\bts\bs o\bof\bf D\bDi\bim\bme\ben\bns\bsi\bio\bon\bns\bs_\b?\b\u00b6 *\b**\b**\b**\b*\n A common task when testing xarray user code is checking that your function\n works for all valid input dimensions. We can chain strategies to achieve this,\n for which the helper strategy unique_subset_of() is useful.\n It works for lists of dimension names\n In [33]: dims = [\"x\", \"y\", \"z\"]\n \n In [34]: xrst.unique_subset_of(dims).example()\n-Out[34]: []\n+Out[34]: ['z', 'x', 'y']\n \n In [35]: xrst.unique_subset_of(dims).example()\n-Out[35]: ['x']\n+Out[35]: ['y', 'z', 'x']\n as well as for mappings of dimension names to sizes\n In [36]: dim_sizes = {\"x\": 2, \"y\": 3, \"z\": 4}\n \n In [37]: xrst.unique_subset_of(dim_sizes).example()\n-Out[37]: {'y': 3, 'z': 4, 'x': 2}\n+Out[37]: {'y': 3}\n \n In [38]: xrst.unique_subset_of(dim_sizes).example()\n-Out[38]: {'x': 2, 'z': 4, 'y': 3}\n+Out[38]: {'z': 4}\n This is useful because operations like reductions can be performed over any\n subset of the xarray object\u2019s dimensions. For example we can write a pytest\n test that tests that a reduction gives the expected result when applying that\n reduction along any possible valid subset of the Variable\u2019s dimensions.\n import numpy.testing as npt\n \n \n"}]}, {"source1": "./usr/share/doc/python-xarray-doc/html/whats-new.html", "source2": "./usr/share/doc/python-xarray-doc/html/whats-new.html", "unified_diff": "@@ -8191,15 +8191,15 @@\n New xray.Dataset.where
method for masking xray objects according\n to some criteria. This works particularly well with multi-dimensional data:
\n In [45]: ds = xray.Dataset(coords={"x": range(100), "y": range(100)})\n \n In [46]: ds["distance"] = np.sqrt(ds.x**2 + ds.y**2)\n \n In [47]: ds.distance.where(ds.distance < 100).plot()\n-Out[47]: <matplotlib.collections.QuadMesh at 0x7f9dc59e4b90>\n+Out[47]: <matplotlib.collections.QuadMesh at 0x7f1ba3bbd1d0>\n
\n \n
\n \n \n Added new methods xray.DataArray.diff
and xray.Dataset.diff
\n for finite difference calculations along a given axis.
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -5286,15 +5286,15 @@\n * New xray.Dataset.where method for masking xray objects according to some\n criteria. This works particularly well with multi-dimensional data:\n In [45]: ds = xray.Dataset(coords={\"x\": range(100), \"y\": range(100)})\n \n In [46]: ds[\"distance\"] = np.sqrt(ds.x**2 + ds.y**2)\n \n In [47]: ds.distance.where(ds.distance < 100).plot()\n- Out[47]: \n+ Out[47]: \n _\b[_\b__\bi_\bm_\ba_\bg_\be_\bs_\b/_\bw_\bh_\be_\br_\be_\b__\be_\bx_\ba_\bm_\bp_\bl_\be_\b._\bp_\bn_\bg_\b]\n * Added new methods xray.DataArray.diff and xray.Dataset.diff for finite\n difference calculations along a given axis.\n * New xray.DataArray.to_masked_array convenience method for returning a\n numpy.ma.MaskedArray.\n In [48]: da = xray.DataArray(np.random.random_sample(size=(5, 4)))\n \n"}]}]}]}]}]}