Skip to content

Commit

Permalink
Merge branch 'main' into theme_play
Browse files Browse the repository at this point in the history
* main:
  Updated environment lockfiles (SciTools#4458)
  remove asv package dependency (SciTools#4456)
  cube.aggregated_by output bounds (SciTools#4315)
  • Loading branch information
tkknight committed Dec 20, 2021
2 parents f4257a9 + 3638874 commit 823764e
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 71 deletions.
4 changes: 4 additions & 0 deletions docs/src/whatsnew/latest.rst
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,10 @@ This document explains the changes made to Iris for this release
array laziness, allowing efficient comparisons even with larger-than-memory
objects. (:pull:`4439`)

#. `@rcomer`_ modified :meth:`~iris.cube.Cube.aggregated_by` to calculate new
coordinate bounds using minimum and maximum for unordered coordinates,
fixing :issue:`1528`. (:pull:`4315`)


💣 Incompatible Changes
=======================
Expand Down
83 changes: 44 additions & 39 deletions lib/iris/analysis/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2170,15 +2170,20 @@ def _compute_groupby_coords(self):
def _compute_shared_coords(self):
"""Create the new shared coordinates given the group slices."""

groupby_indices = []
groupby_bounds = []

# Iterate over the ordered dictionary in order to construct
# a list of tuple group boundary indexes.
# Iterate over the ordered dictionary in order to construct a list of
# tuple group indices, and a list of the respective bounds of those
# indices.
for key_slice in self._slices_by_key.values():
if isinstance(key_slice, tuple):
groupby_bounds.append((key_slice[0], key_slice[-1]))
indices = key_slice
else:
groupby_bounds.append((key_slice.start, key_slice.stop - 1))
indices = tuple(range(*key_slice.indices(self._stop)))

groupby_indices.append(indices)
groupby_bounds.append((indices[0], indices[-1]))

# Create new shared bounded coordinates.
for coord, dim in self._shared_coords:
Expand All @@ -2197,15 +2202,9 @@ def _compute_shared_coords(self):
new_shape += shape[:-1]
work_arr = work_arr.reshape(work_shape)

for key_slice in self._slices_by_key.values():
if isinstance(key_slice, slice):
indices = key_slice.indices(
coord.points.shape[dim]
)
key_slice = range(*indices)

for indices in groupby_indices:
for arr in work_arr:
new_points.append("|".join(arr.take(key_slice)))
new_points.append("|".join(arr.take(indices)))

# Reinstate flattened dimensions. Aggregated dim now leads.
new_points = np.array(new_points).reshape(new_shape)
Expand All @@ -2220,48 +2219,54 @@ def _compute_shared_coords(self):
raise ValueError(msg)
else:
new_bounds = []
if coord.has_bounds():
# Derive new coord's bounds from bounds.
item = coord.bounds
maxmin_axis = (dim, -1)
first_choices = coord.bounds.take(0, -1)
last_choices = coord.bounds.take(1, -1)
else:
# Derive new coord's bounds from points.
item = coord.points
maxmin_axis = dim
first_choices = last_choices = coord.points

# Check whether item is monotonic along the dimension of interest.
deltas = np.diff(item, 1, dim)
monotonic = np.all(deltas >= 0) or np.all(deltas <= 0)

# Construct list of coordinate group boundary pairs.
for start, stop in groupby_bounds:
if coord.has_bounds():
# Collapse group bounds into bounds.
if monotonic:
# Use first and last bound or point for new bounds.
for start, stop in groupby_bounds:
if (
getattr(coord, "circular", False)
and (stop + 1) == coord.shape[dim]
and (stop + 1) == self._stop
):
new_bounds.append(
[
coord.bounds.take(start, dim).take(0, -1),
coord.bounds.take(0, dim).take(0, -1)
+ coord.units.modulus,
]
)
else:
new_bounds.append(
[
coord.bounds.take(start, dim).take(0, -1),
coord.bounds.take(stop, dim).take(1, -1),
]
)
else:
# Collapse group points into bounds.
if getattr(coord, "circular", False) and (
stop + 1
) == len(coord.points):
new_bounds.append(
[
coord.points.take(start, dim),
coord.points.take(0, dim)
first_choices.take(start, dim),
first_choices.take(0, dim)
+ coord.units.modulus,
]
)
else:
new_bounds.append(
[
coord.points.take(start, dim),
coord.points.take(stop, dim),
first_choices.take(start, dim),
last_choices.take(stop, dim),
]
)
else:
# Use min and max bound or point for new bounds.
for indices in groupby_indices:
item_slice = item.take(indices, dim)
new_bounds.append(
[
item_slice.min(axis=maxmin_axis),
item_slice.max(axis=maxmin_axis),
]
)

# Bounds needs to be an array with the length 2 start-stop
# dimension last, and the aggregated dimension back in its
Expand Down
26 changes: 24 additions & 2 deletions lib/iris/tests/unit/cube/test_Cube.py
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,29 @@ def test_agg_by_label(self):
res_cube = self.cube.aggregated_by("label", self.mock_agg)
val_coord = AuxCoord(
np.array([1.0, 0.5, 1.0]),
bounds=np.array([[0, 2], [0, 1], [2, 0]]),
bounds=np.array([[0, 2], [0, 1], [0, 2]]),
long_name="val",
)
label_coord = AuxCoord(
np.array(["alpha", "beta", "gamma"]),
long_name="label",
units="no_unit",
)
self.assertEqual(res_cube.coord("val"), val_coord)
self.assertEqual(res_cube.coord("label"), label_coord)

def test_agg_by_label_bounded(self):
# Aggregate a cube on a string coordinate label where label
# and val entries are not in step; the resulting cube has a val
# coord of bounded cells and a label coord of single string entries.
val_points = self.cube.coord("val").points
self.cube.coord("val").bounds = np.array(
[val_points - 0.5, val_points + 0.5]
).T
res_cube = self.cube.aggregated_by("label", self.mock_agg)
val_coord = AuxCoord(
np.array([1.0, 0.5, 1.0]),
bounds=np.array([[-0.5, 2.5], [-0.5, 1.5], [-0.5, 2.5]]),
long_name="val",
)
label_coord = AuxCoord(
Expand Down Expand Up @@ -890,7 +912,7 @@ def test_agg_by_label__lazy(self):
res_cube = self.cube.aggregated_by("label", MEAN)
val_coord = AuxCoord(
np.array([1.0, 0.5, 1.0]),
bounds=np.array([[0, 2], [0, 1], [2, 0]]),
bounds=np.array([[0, 2], [0, 1], [0, 2]]),
long_name="val",
)
label_coord = AuxCoord(
Expand Down
27 changes: 13 additions & 14 deletions requirements/ci/nox.lock/py37-linux-64.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Generated by conda-lock.
# platform: linux-64
# input_hash: f2449723874977e1bb5b571ab6f475f8d251e472d6f8826bd40fbb774e3916f7
# input_hash: 2ded1a5e8a7c81e393e358171ff923c72d099e77a007d70daa2a15beb3a59545
@EXPLICIT
https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81
https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.10.8-ha878542_0.tar.bz2#575611b8a84f45960e87722eeb51fa26
Expand All @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9
https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-11.2.0-h5c6108e_11.tar.bz2#2dcb18a9a0fa31f4f29e5a9b3eade394
https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-11.2.0-he4da1e4_11.tar.bz2#0bf83958e788f1e75ba26154cb702afe
https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf
https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_1.tar.bz2#ca56dd3e2768f99f9e19869efb3434ec
https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_2.tar.bz2#17460296fbd27310a0d796115d79c930
https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29
https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-11.2.0-h69a702a_11.tar.bz2#4ea2f9f83b617a7682e8aa05dcb37c6a
https://conda.anaconda.org/conda-forge/linux-64/libgomp-11.2.0-h1d223b6_11.tar.bz2#1d16527c76842bf9c41e9399d39d8097
Expand Down Expand Up @@ -78,7 +78,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h36c2ea0_1013.tar.bz
https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h7f98852_6.tar.bz2#9e94bf16f14c78a36561d5019f490d22
https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h10796ff_3.tar.bz2#21a8d66dc17f065023b33145c42652fe
https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-12_linux64_openblas.tar.bz2#2e5082d4a9a18c21100e6ce5b6bcb4ec
https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.1-h174f98d_0.tar.bz2#b14ca7dc99d099dccf38d4d31ead3d63
https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.2-h174f98d_0.tar.bz2#76dc12f1c2366b02b9e21773fe122aeb
https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-12_linux64_openblas.tar.bz2#9f401a6807a97e0c859d7522ae3d51ec
https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-hf817b99_2.tar.bz2#646fa2f7c60b69ee8f918668e9c2fd31
https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_1.tar.bz2#d0a7846b7b3b8fb0d8b36904a53b8155
Expand All @@ -93,38 +93,38 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.0-ha95c52a_0.tar.bz2#b5
https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.36.0-h3371d22_4.tar.bz2#661e1ed5d92552785d9f8c781ce68685
https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h7f98852_6.tar.bz2#612385c4a83edb0619fe911d9da317f4
https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa
https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.70.1-h780b84a_0.tar.bz2#e60c13f740e8988a6efa2822d63738bd
https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.70.2-h780b84a_0.tar.bz2#667ba134b9e86e9f000d6e67a39e22f5
https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.18.5-h9f60fe5_2.tar.bz2#6221115a24700aa8598ae5aa1574902d
https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363
https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.2-hcc1bbae_3.tar.bz2#e29650992ae593bc05fc93722483e5c3
https://conda.anaconda.org/conda-forge/linux-64/libclang-11.1.0-default_ha53f305_1.tar.bz2#b9b71585ca4fcb5d442c5a9df5dd7e98
https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-h6f004c6_2.tar.bz2#34fda41ca84e67232888c9a885903055
https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.0.3-he3ba5ed_0.tar.bz2#f9dbabc7e01c459ed7a1d1d64b206e9b
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_1.tar.bz2#577ac13be280c34b2f0cfd44267d2eac
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_2.tar.bz2#8e2e8f9dcbd12b482be6bf8474bb1d34
https://conda.anaconda.org/conda-forge/linux-64/nss-3.73-hb5efdd6_0.tar.bz2#a5b91a14292ac34bac1f0506a3772fd5
https://conda.anaconda.org/conda-forge/linux-64/python-3.7.12-hb7a2778_100_cpython.tar.bz2#2d94b3e6a9fdaf83f6955d008c8011a7
https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4
https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb
https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.12-py_0.tar.bz2#2489a97287f90176ecdc3ca982b4b0a0
https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b
https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c
https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.0.8-pyhd8ed1ab_0.tar.bz2#7bc3465ff423c243bf8b2e77c5075bc7
https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.0.9-pyhd8ed1ab_0.tar.bz2#a57a3f6f2b0a7400e340f850c405df19
https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.0.0-pyhd8ed1ab_0.tar.bz2#3a8fc8b627d5fb6af827e126a10a86c6
https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.4-pyh9f0ad1d_0.tar.bz2#c08b4c1326b880ed44f3ffb04803332f
https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.3-pyhd8ed1ab_0.tar.bz2#cc7dae067bb31c1598e23e151dfca986
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.4-pyhd8ed1ab_0.tar.bz2#7b50d840543d9cdae100e91582c33035
https://conda.anaconda.org/conda-forge/noarch/filelock-3.4.0-pyhd8ed1ab_0.tar.bz2#caff9785491992b3250ed4048fe51e2c
https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1005.tar.bz2#fd3611672eb91bc9d24fd6fb970037eb
https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.11.1-pyhd8ed1ab_0.tar.bz2#a510ec93fdb50775091d2afba98a8acb
https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2
https://conda.anaconda.org/conda-forge/linux-64/glib-2.70.1-h780b84a_0.tar.bz2#bc4795f9d11dba7990c7e9cf9f7021b3
https://conda.anaconda.org/conda-forge/linux-64/glib-2.70.2-h780b84a_0.tar.bz2#715dda657174cfd3a312c8b6694fd6ca
https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.18.5-hf529b03_2.tar.bz2#3cf866063f2803944ddaee8b1d6da531
https://conda.anaconda.org/conda-forge/noarch/idna-3.1-pyhd3deb0d_0.tar.bz2#9c9aea4b8391264477df484f798562d0
https://conda.anaconda.org/conda-forge/noarch/imagesize-1.3.0-pyhd8ed1ab_0.tar.bz2#be807e7606fff9436e5e700f6bffb7c6
https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9
https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f
https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.80.0-h2574ce0_0.tar.bz2#5d0784b790350f7939bb5d3f2c32e700
https://conda.anaconda.org/conda-forge/linux-64/libpq-13.5-hd57d9b9_0.tar.bz2#20a3e094316bbaa7b890ccbd9c97acd5
https://conda.anaconda.org/conda-forge/linux-64/libpq-13.5-hd57d9b9_1.tar.bz2#a0f425d61c7df890d6381ea352c3f1d7
https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.1-h3452ae3_0.tar.bz2#6d4bf6265d998b6c975c26a6a24062a2
https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d
https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19
Expand Down Expand Up @@ -153,10 +153,10 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h6cf1ce9_1008.tar.b
https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.10.8-py37h89c1867_1.tar.bz2#48e8442b6097c7d4a0e3494c74ff9eeb
https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.0-py37h036bc23_0.tar.bz2#05ab26c7685bcb7dd8bc8752c121f823
https://conda.anaconda.org/conda-forge/linux-64/curl-7.80.0-h2574ce0_0.tar.bz2#4d8fd67e5ab7e00fde8ad085464f43b7
https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.24-py37hcd2ae1e_1.tar.bz2#c32a8d5bea21a1a7074b005199a45ede
https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.25-py37hcd2ae1e_0.tar.bz2#4e9a69a5815f562d2bb1379ebbb63c19
https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h48d8840_2.tar.bz2#eba672c69baf366fdedd1c6f702dbb81
https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py37h89c1867_1.tar.bz2#e0a3be74a594032b73f22762ba9941cc
https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-mpi_mpich_h9c45103_2.tar.bz2#39a57ab5ac7b7ea3342ba45d8c905a5e
https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-mpi_mpich_h9c45103_3.tar.bz2#4f1a733e563d27b98010b62888e149c9
https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.8.2-py37h89c1867_0.tar.bz2#a62f2bad6654c1a91e3241ca7979fe05
https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.2-py37h2527ec5_1.tar.bz2#441ac4d93d0d57d21ea9dcac48cb5d0d
https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6ad9fb6_0.tar.bz2#45142dc44fcd04934f9ad68ce205e54d
Expand All @@ -176,11 +176,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py37h5e8e339_3.tar.bz
https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.4.0-py37h89c1867_0.tar.bz2#01f5271a7c204862ca564ee63b35548d
https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py37h5e8e339_2.tar.bz2#ec86ae00c96dea5f2d810957a8fabc26
https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-13.0.0.post2-py37h5e8e339_4.tar.bz2#6702ec56e12a0be3c70bf05991187bfd
https://conda.anaconda.org/conda-forge/linux-64/asv-0.4.2-py37hcd2ae1e_3.tar.bz2#0f076ca34a73c99253999aa65d787034
https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h5e8e339_1003.tar.bz2#4ad2e74470a3c08b0f6d59699f0d9a32
https://conda.anaconda.org/conda-forge/linux-64/cftime-1.5.1.1-py37hb1e94ed_1.tar.bz2#1b5b81088bc7d7e0bef7de4ef4bd1221
https://conda.anaconda.org/conda-forge/linux-64/cryptography-36.0.0-py37hf1a17b8_0.tar.bz2#2fd357ed549ff7f39a04f329938de4b3
https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.11.2-pyhd8ed1ab_0.tar.bz2#c3615fd90d2e5b11c5da6ea1f9a5730b
https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.12.0-pyhd8ed1ab_0.tar.bz2#e572bf40b1e8783fed2526ecb5f5209e
https://conda.anaconda.org/conda-forge/linux-64/editdistance-s-1.0.0-py37h2527ec5_2.tar.bz2#9aba6bcb02d12dbd2fead23b85720712
https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.28.3-py37h5e8e339_0.tar.bz2#5b7840e065bcdbfc6aaa72d772fcd190
https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-3.1.1-h83ec7ef_0.tar.bz2#ca8faaee04a83e3c4d6f708a35ac2ec3
Expand Down Expand Up @@ -219,7 +218,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py37he336c9b_8.ta
https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py37he336c9b_8.tar.bz2#0a67d477c0524897883ca0f86d6fb15c
https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.7-pyhd8ed1ab_0.tar.bz2#be75bab4820a56f77ba1a3fc9139c36a
https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.2.0-mpi_mpich_py37h7352969_101.tar.bz2#64fd02e7a0cefe0b5c604fea03774c73
https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.49.3-h85b4f2f_0.tar.bz2#71062453180260ef85c861996b29bd6a
https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h85b4f2f_1.tar.bz2#bc6418fd87ea67cf14417337ced3daa2
https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py37h89c1867_8.tar.bz2#8038f9765a907fcf6fdfa6a9db71e371
https://conda.anaconda.org/conda-forge/noarch/requests-2.26.0-pyhd8ed1ab_1.tar.bz2#358581cc782802270d77c454c73a811a
https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py37h89c1867_0.tar.bz2#dc2167a62be1ca5253727201368ddc89
Expand Down
Loading

0 comments on commit 823764e

Please sign in to comment.