Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GenevieveBuckley/533be2241517090447d06d7eaaca1948 to your computer and use it in GitHub Desktop.
Save GenevieveBuckley/533be2241517090447d06d7eaaca1948 to your computer and use it in GitHub Desktop.
Bug report, unexpected behaviour in the fastplotlib library (flipping image orientations)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "8028b02c-11bd-46d7-af60-c9007feda5e9",
"metadata": {},
"source": [
"# fastplotlib bug report"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "ebfb2dfd-e9b0-46ee-a3bb-93b439b8265b",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "35c2fe570e254951b81ade88f2d77036",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"RFBOutputContext()"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1c352a1e14f746588cb26ae67182662c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(JupyterWgpuCanvas(), HBox(children=(Button(icon='expand-arrows-alt', layout=Layout(width='auto'…"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import fastplotlib as fpl\n",
"import imageio.v3 as iio\n",
"\n",
"# create a `Plot` instance\n",
"plot = fpl.Plot()\n",
"\n",
"# get a grayscale image\n",
"data = iio.imread(\"imageio:camera.png\")\n",
"\n",
"# plot the image data\n",
"image_graphic = plot.add_image(data=data, name=\"sample-image\")\n",
"\n",
"# show the plot\n",
"plot.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "13b90af7-119e-4fa2-840c-301089236fdf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n",
"1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "0d120cd2-14ef-4852-9d51-b34ae9492575",
"metadata": {},
"source": [
"## Flip image on x-axis\n",
"\n",
"Results are as expected"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "53aa8afb-2145-4dab-a398-52cdffcc1e79",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n",
"-1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image\n",
"plot.camera.world.scale_x *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "7d7f7f55-61c1-4153-9f3d-770821623bbc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n",
"1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image back to starting orientation\n",
"plot.camera.world.scale_x *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "4a123639-e8aa-46ae-813d-18583ab50d4c",
"metadata": {},
"source": [
"## Flip image on y-axis\n",
"\n",
"Not as expected"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "45e05f2e-c7f1-4814-8c91-580c922896cb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n",
"-1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image\n",
"plot.camera.world.scale_y *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "97153696-0c8b-401e-ad76-a6b0a59890df",
"metadata": {},
"source": [
"... what is happening here? We flipped the y axis, but the change is showing up in `scale_x`, not `scale_y`"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "8c560bef-9ea6-414b-aa8e-f2c6beca4b2b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n",
"1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image back to starting orientation\n",
"plot.camera.world.scale_y *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "a87a1350-9583-48ac-b254-162cd6f757c7",
"metadata": {},
"source": [
"## Flip image on z-axis\n",
"\n",
"Not as expected"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "745dde88-753a-4a9e-b7b1-a3e629c5baed",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n",
"-1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image\n",
"plot.camera.world.scale_z *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "0d713c82-fb65-4ef3-82da-3ce74d076cdb",
"metadata": {},
"source": [
"Nothing appears to happen to the image, but that part we expect because the actual image we passed to the fastplotlib graphic is 2D.\n",
"\n",
"Not as expected, again as before, even though we are updating in z, the change is being reported in `scale_x`."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4b1b8d92-8fc0-4e24-8ca3-66aaf5783279",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n",
"1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# flip image back to starting orientation\n",
"plot.camera.world.scale_z *= -1\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "5be91a5a-88e3-490b-82d2-27e546fc51e6",
"metadata": {},
"source": [
"## Even more confusing...\n",
"\n",
"Things get even more confusing when I start changing the values in the `scale` list.\n",
"\n",
"The displayed image can flip diagonnaly in x & y, the second time you change the values in `scale`."
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "ad2697d5-60d0-4def-aba6-4370a95f18a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n",
"1.0\n",
"1.0\n",
"1.0\n"
]
}
],
"source": [
"# Reset view in display\n",
"plot.camera.world.scale = [1, 1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"print(plot.camera.world.scale_x)\n",
"print(plot.camera.world.scale_y)\n",
"print(plot.camera.world.scale_z)"
]
},
{
"cell_type": "markdown",
"id": "74465402-663e-4a08-80f6-6a1f3e8c65a5",
"metadata": {},
"source": [
"### works as expected in x"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "a00712ad-5751-4a93-832d-7d2a10ebbb98",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"plot.camera.world.scale = [-1, 1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# this is as expected"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "6869ccd8-79ba-4167-bf97-ab835fbe7dde",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# if you repeat the same command/change, \n",
"# then nothing changes in the display (that's what I expect)\n",
"plot.camera.world.scale = [-1, 1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# this is as expected"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "4769c5f9-be04-4fae-94f1-ec7ebb9fa482",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n"
]
}
],
"source": [
"# return everything to the original starting point\n",
"plot.camera.world.scale = [1, 1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# works as expected"
]
},
{
"cell_type": "markdown",
"id": "99fcbf5e-727b-4104-a0cd-a172b671f420",
"metadata": {},
"source": [
"### does not work as expected in y (or z)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "da71685b-5ac5-4b1c-8318-8f28d4185afe",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# now let's try flipping in y\n",
"plot.camera.world.scale = [1, -1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# display flip works as expected,\n",
"# but `plot.camera.world.scale` returns [-1. 1. 1.]\n",
"# instead of the expected [1. -1. 1.]"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "9a7b3856-ea19-4635-b00a-48b94eda9f42",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# BUT THIS TIME IF I REPEAT THE SAME COMMAND\n",
"# I GET A DIAGONAL FLIP\n",
"# (both x and y axes flip at the same time)\n",
"plot.camera.world.scale = [1, -1, 1]\n",
"\n",
"print(plot.camera.world.scale) # also reporting only changes in x, very weird\n",
"# not as expected"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "f828e89d-2fa0-492a-9162-17e6db1058e7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 1. 1.]\n"
]
}
],
"source": [
"# return everything to the original starting point\n",
"plot.camera.world.scale = [1, 1, 1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# works as expected"
]
},
{
"cell_type": "markdown",
"id": "1da512f4-d8a1-4442-b7d1-155a1800e70d",
"metadata": {},
"source": [
"### it also does not work as expected in z"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "1ce8c6bf-a67c-4f5a-859c-c8b233fb5441",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# now let's try flipping in z\n",
"plot.camera.world.scale = [1, 1, -1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# display seems unchanged - this is as expected because we are showing a 2d image\n",
"# but `plot.camera.world.scale` returns [-1. 1. 1.]\n",
"# instead of the expected [1. 1. -1.]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "45773cbd-8f9b-4515-868a-56711f0b925a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# BUT THIS TIME IF I REPEAT THE SAME COMMAND\n",
"# I GET A FLIP\n",
"plot.camera.world.scale = [1, 1, -1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# not as epected"
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "e2d6af62-73a1-4e46-b9c5-d833a0d9b8c2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 1. 1.]\n"
]
}
],
"source": [
"# continuing to repeat the same command continues flipping hte image along the x axis\n",
"plot.camera.world.scale = [1, 1, -1]\n",
"\n",
"print(plot.camera.world.scale)\n",
"# not as epected"
]
},
{
"cell_type": "markdown",
"id": "fc74d928-1d94-4b56-96dc-044cdd143ede",
"metadata": {},
"source": [
"## System details"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "9456e50c-6338-4ed2-86bd-25be6961250e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.1.0.a12'"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fpl.__version__"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "a2bd812d-899a-4e33-978a-04b3fc42a467",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'vendor': '',\n",
" 'architecture': '',\n",
" 'device': 'Apple M1',\n",
" 'description': '',\n",
" 'adapter_type': 'IntegratedGPU',\n",
" 'backend_type': 'Metal'}"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# my system details\n",
"plot.renderer.device.adapter.request_adapter_info()"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "d3769cc5-fb64-41db-b594-f56acd9bd6a6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"# packages in environment at /Users/genevieb/mambaforge/envs/napari-dev:\n",
"#\n",
"# Name Version Build Channel\n",
"absl-py 1.4.0 pypi_0 pypi\n",
"aiohttp 3.8.4 pypi_0 pypi\n",
"aiosignal 1.3.1 pypi_0 pypi\n",
"alabaster 0.7.13 pyhd8ed1ab_0 conda-forge\n",
"anyio 3.7.1 pyhd8ed1ab_0 conda-forge\n",
"aom 3.5.0 h7ea286d_0 conda-forge\n",
"app-model 0.1.4 pyhd8ed1ab_0 conda-forge\n",
"appdirs 1.4.4 pyh9f0ad1d_0 conda-forge\n",
"appnope 0.1.3 pyhd8ed1ab_0 conda-forge\n",
"argon2-cffi 21.3.0 pyhd8ed1ab_0 conda-forge\n",
"argon2-cffi-bindings 21.2.0 py310h8e9501a_3 conda-forge\n",
"arrow 1.2.3 pypi_0 pypi\n",
"asciitree 0.3.3 py_2 conda-forge\n",
"asttokens 2.2.1 pyhd8ed1ab_0 conda-forge\n",
"astunparse 1.6.3 pypi_0 pypi\n",
"async-lru 2.0.3 pyhd8ed1ab_0 conda-forge\n",
"async-timeout 4.0.2 pypi_0 pypi\n",
"attrs 23.1.0 pyh71513ae_1 conda-forge\n",
"autopep8 2.0.2 pyhd8ed1ab_0 conda-forge\n",
"aws-c-auth 0.7.0 h4ac17b4_1 conda-forge\n",
"aws-c-cal 0.6.0 h43a37b4_0 conda-forge\n",
"aws-c-common 0.8.23 hb547adb_0 conda-forge\n",
"aws-c-compression 0.2.17 h31a6291_1 conda-forge\n",
"aws-c-event-stream 0.3.1 h1e1aaf7_1 conda-forge\n",
"aws-c-http 0.7.10 h3107daf_3 conda-forge\n",
"aws-c-io 0.13.28 hf096fb3_0 conda-forge\n",
"aws-c-mqtt 0.8.14 h567deb8_1 conda-forge\n",
"aws-c-s3 0.3.13 hf0ec796_1 conda-forge\n",
"aws-c-sdkutils 0.1.11 h31a6291_1 conda-forge\n",
"aws-checksums 0.1.16 h31a6291_1 conda-forge\n",
"aws-crt-cpp 0.20.3 hc3a2d08_3 conda-forge\n",
"aws-sdk-cpp 1.10.57 h6f3a27c_17 conda-forge\n",
"babel 2.12.1 pyhd8ed1ab_1 conda-forge\n",
"backcall 0.2.0 pyh9f0ad1d_0 conda-forge\n",
"backports 1.0 pyhd8ed1ab_3 conda-forge\n",
"backports.functools_lru_cache 1.6.5 pyhd8ed1ab_0 conda-forge\n",
"beautifulsoup4 4.12.2 pyha770c72_0 conda-forge\n",
"bleach 6.0.0 pyhd8ed1ab_0 conda-forge\n",
"blosc 1.21.4 hc338f07_0 conda-forge\n",
"bokeh 3.2.0 pyhd8ed1ab_0 conda-forge\n",
"brotli 1.0.9 h1a8c8d9_9 conda-forge\n",
"brotli-bin 1.0.9 h1a8c8d9_9 conda-forge\n",
"brotli-python 1.0.9 py310h0f1eb42_9 conda-forge\n",
"brunsli 0.1 h9f76cd9_0 conda-forge\n",
"btrack 0.6.2 pypi_0 pypi\n",
"bzip2 1.0.8 h3422bc3_4 conda-forge\n",
"c-ares 1.19.1 hb547adb_0 conda-forge\n",
"c-blosc2 2.10.0 h068da5f_0 conda-forge\n",
"ca-certificates 2023.5.7 hf0a4a13_0 conda-forge\n",
"cached-property 1.5.2 hd8ed1ab_1 conda-forge\n",
"cached_property 1.5.2 pyha770c72_1 conda-forge\n",
"cachetools 5.3.1 pypi_0 pypi\n",
"cachey 0.2.1 pyh9f0ad1d_0 conda-forge\n",
"certifi 2023.5.7 pyhd8ed1ab_0 conda-forge\n",
"cffi 1.15.1 py310h2399d43_3 conda-forge\n",
"cfitsio 4.2.0 h2f961c4_0 conda-forge\n",
"cftime 1.6.2 py310hf1a086a_1 conda-forge\n",
"charls 2.4.2 h13dd4ca_0 conda-forge\n",
"charset-normalizer 3.2.0 pyhd8ed1ab_0 conda-forge\n",
"click 8.1.4 unix_pyh707e725_0 conda-forge\n",
"cloudpickle 2.2.1 pyhd8ed1ab_0 conda-forge\n",
"colorama 0.4.6 pyhd8ed1ab_0 conda-forge\n",
"comm 0.1.3 pyhd8ed1ab_0 conda-forge\n",
"contourpy 1.1.0 py310h38f39d4_0 conda-forge\n",
"csbdeep 0.7.3 pypi_0 pypi\n",
"cvxopt 1.3.1 py310hadc6ad6_0 conda-forge\n",
"cycler 0.11.0 pyhd8ed1ab_0 conda-forge\n",
"cython 0.29.36 py310h1253130_0 conda-forge\n",
"cytoolz 0.12.0 py310h8e9501a_1 conda-forge\n",
"dask 2023.7.0 pyhd8ed1ab_0 conda-forge\n",
"dask-core 2023.7.0 pyhd8ed1ab_0 conda-forge\n",
"dask-labextension 6.1.0 pypi_0 pypi\n",
"dav1d 1.2.1 hb547adb_0 conda-forge\n",
"debugpy 1.6.7 py310h0f1eb42_0 conda-forge\n",
"decorator 5.1.1 pyhd8ed1ab_0 conda-forge\n",
"defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge\n",
"deprecated 1.2.14 pyh1a96a4e_0 conda-forge\n",
"distributed 2023.7.0 pyhd8ed1ab_0 conda-forge\n",
"docstring_parser 0.15 pyhd8ed1ab_0 conda-forge\n",
"docutils 0.17.1 py310hbe9552e_3 conda-forge\n",
"dsdp 5.8 h9397a75_1203 conda-forge\n",
"entrypoints 0.4 pyhd8ed1ab_0 conda-forge\n",
"exceptiongroup 1.1.2 pyhd8ed1ab_0 conda-forge\n",
"executing 1.2.0 pyhd8ed1ab_0 conda-forge\n",
"expat 2.5.0 hb7217d7_1 conda-forge\n",
"fasteners 0.17.3 pyhd8ed1ab_0 conda-forge\n",
"fastplotlib 0.1.0a12 pypi_0 pypi\n",
"fftw 3.3.10 nompi_h3046061_108 conda-forge\n",
"flatbuffers 23.5.26 pypi_0 pypi\n",
"flit-core 3.9.0 pyhd8ed1ab_0 conda-forge\n",
"font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge\n",
"font-ttf-inconsolata 3.000 h77eed37_0 conda-forge\n",
"font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge\n",
"font-ttf-ubuntu 0.83 hab24e00_0 conda-forge\n",
"fontconfig 2.14.2 h82840c6_0 conda-forge\n",
"fonts-conda-ecosystem 1 0 conda-forge\n",
"fonts-conda-forge 1 0 conda-forge\n",
"fonttools 4.40.0 py310h2aa6e3c_0 conda-forge\n",
"fqdn 1.5.1 pypi_0 pypi\n",
"freetype 2.12.1 hd633e50_1 conda-forge\n",
"freetype-py 2.4.0 pyhd8ed1ab_0 conda-forge\n",
"frozenlist 1.3.3 pypi_0 pypi\n",
"fsspec 2023.6.0 pyh1a96a4e_0 conda-forge\n",
"gast 0.4.0 pypi_0 pypi\n",
"gettext 0.21.1 h0186832_0 conda-forge\n",
"gflags 2.2.2 hc88da5d_1004 conda-forge\n",
"giflib 5.2.1 h1a8c8d9_3 conda-forge\n",
"glib 2.76.4 ha614eb4_0 conda-forge\n",
"glib-tools 2.76.4 ha614eb4_0 conda-forge\n",
"glog 0.6.0 h6da1cb0_0 conda-forge\n",
"glpk 5.0 h6d7a090_0 conda-forge\n",
"gmp 6.2.1 h9f76cd9_0 conda-forge\n",
"google-auth 2.21.0 pypi_0 pypi\n",
"google-auth-oauthlib 1.0.0 pypi_0 pypi\n",
"google-pasta 0.2.0 pypi_0 pypi\n",
"grpcio 1.56.0 pypi_0 pypi\n",
"gsl 2.7 h6e638da_0 conda-forge\n",
"gst-plugins-base 1.22.4 h27255cc_1 conda-forge\n",
"gstreamer 1.22.4 h8c52bba_1 conda-forge\n",
"h5py 3.9.0 nompi_py310h7fd3376_101 conda-forge\n",
"hdbscan 0.8.29 py310hf1a086a_2 conda-forge\n",
"hdf4 4.2.15 h8111dcc_6 conda-forge\n",
"hdf5 1.14.1 nompi_h3aba7b3_100 conda-forge\n",
"heapdict 1.0.1 py_0 conda-forge\n",
"hsluv 5.0.2 pyh44b312d_0 conda-forge\n",
"icu 72.1 he12128b_0 conda-forge\n",
"idna 3.4 pyhd8ed1ab_0 conda-forge\n",
"imagecodecs 2023.1.23 py310hcb660b6_2 conda-forge\n",
"imageio 2.31.1 pyh24c5eb1_0 conda-forge\n",
"imageio-ffmpeg 0.4.8 pypi_0 pypi\n",
"imagesize 1.4.1 pyhd8ed1ab_0 conda-forge\n",
"importlib-metadata 6.8.0 pyha770c72_0 conda-forge\n",
"importlib_metadata 6.8.0 hd8ed1ab_0 conda-forge\n",
"importlib_resources 6.0.0 pyhd8ed1ab_1 conda-forge\n",
"in-n-out 0.1.8 pyhd8ed1ab_0 conda-forge\n",
"ipykernel 6.24.0 pyh5fb750a_0 conda-forge\n",
"ipython 8.14.0 pyhd1c38e8_0 conda-forge\n",
"ipython_genutils 0.2.0 py_1 conda-forge\n",
"ipywidgets 8.0.7 pyhd8ed1ab_0 conda-forge\n",
"isoduration 20.11.0 pypi_0 pypi\n",
"jedi 0.18.2 pyhd8ed1ab_0 conda-forge\n",
"jinja2 3.1.2 pyhd8ed1ab_1 conda-forge\n",
"joblib 1.3.0 pyhd8ed1ab_1 conda-forge\n",
"json5 0.9.14 pyhd8ed1ab_0 conda-forge\n",
"jsonpointer 2.4 pypi_0 pypi\n",
"jsonschema 4.18.0 pyhd8ed1ab_0 conda-forge\n",
"jsonschema-specifications 2023.6.1 pyhd8ed1ab_0 conda-forge\n",
"jupyter 1.0.0 py310hbe9552e_8 conda-forge\n",
"jupyter-lsp 2.2.0 pyhd8ed1ab_0 conda-forge\n",
"jupyter-rfb 0.4.1 pypi_0 pypi\n",
"jupyter-server-proxy 4.0.0 pypi_0 pypi\n",
"jupyter_client 8.3.0 pyhd8ed1ab_0 conda-forge\n",
"jupyter_console 6.6.3 pyhd8ed1ab_0 conda-forge\n",
"jupyter_core 5.3.1 py310hbe9552e_0 conda-forge\n",
"jupyter_events 0.6.3 pyhd8ed1ab_0 conda-forge\n",
"jupyter_server 2.7.0 pyhd8ed1ab_0 conda-forge\n",
"jupyter_server_terminals 0.4.4 pyhd8ed1ab_1 conda-forge\n",
"jupyterlab 4.0.2 pyhd8ed1ab_0 conda-forge\n",
"jupyterlab_pygments 0.2.2 pyhd8ed1ab_0 conda-forge\n",
"jupyterlab_server 2.23.0 pyhd8ed1ab_0 conda-forge\n",
"jupyterlab_widgets 3.0.8 pyhd8ed1ab_0 conda-forge\n",
"jxrlib 1.1 h27ca646_2 conda-forge\n",
"keras 2.13.1 pypi_0 pypi\n",
"kiwisolver 1.4.4 py310h2887b22_1 conda-forge\n",
"krb5 1.20.1 h69eda48_0 conda-forge\n",
"lazy_loader 0.2 pyhd8ed1ab_0 conda-forge\n",
"lcms2 2.15 hd835a16_1 conda-forge\n",
"lerc 4.0.0 h9a09cb3_0 conda-forge\n",
"libabseil 20230125.3 cxx17_h13dd4ca_0 conda-forge\n",
"libaec 1.0.6 hb7217d7_1 conda-forge\n",
"libarrow 12.0.1 hdeb1470_4_cpu conda-forge\n",
"libavif 0.11.1 h9f83d30_2 conda-forge\n",
"libblas 3.9.0 17_osxarm64_openblas conda-forge\n",
"libbrotlicommon 1.0.9 h1a8c8d9_9 conda-forge\n",
"libbrotlidec 1.0.9 h1a8c8d9_9 conda-forge\n",
"libbrotlienc 1.0.9 h1a8c8d9_9 conda-forge\n",
"libcblas 3.9.0 17_osxarm64_openblas conda-forge\n",
"libclang 16.0.0 pypi_0 pypi\n",
"libclang13 15.0.7 default_hc7183e1_2 conda-forge\n",
"libcrc32c 1.1.2 hbdafb3b_0 conda-forge\n",
"libcurl 8.1.2 h912dcd9_0 conda-forge\n",
"libcxx 16.0.6 h4653b0c_0 conda-forge\n",
"libdeflate 1.18 h1a8c8d9_0 conda-forge\n",
"libedit 3.1.20191231 hc8eb9b7_2 conda-forge\n",
"libev 4.33 h642e427_1 conda-forge\n",
"libevent 2.1.12 h2757513_1 conda-forge\n",
"libexpat 2.5.0 hb7217d7_1 conda-forge\n",
"libffi 3.4.2 h3422bc3_5 conda-forge\n",
"libgfortran 5.0.0 12_2_0_hd922786_31 conda-forge\n",
"libgfortran5 12.2.0 h0eea778_31 conda-forge\n",
"libglib 2.76.4 h24e9cb9_0 conda-forge\n",
"libgoogle-cloud 2.12.0 h05652e3_1 conda-forge\n",
"libgrpc 1.56.0 h9075ed4_2 conda-forge\n",
"libiconv 1.17 he4db4b2_0 conda-forge\n",
"libjpeg-turbo 2.1.5.1 h1a8c8d9_0 conda-forge\n",
"liblapack 3.9.0 17_osxarm64_openblas conda-forge\n",
"libllvm14 14.0.6 hd1a9a77_3 conda-forge\n",
"libllvm15 15.0.7 h504e6bf_2 conda-forge\n",
"libnetcdf 4.9.2 nompi_hf3c790a_107 conda-forge\n",
"libnghttp2 1.52.0 hae82a92_0 conda-forge\n",
"libogg 1.3.4 h27ca646_1 conda-forge\n",
"libopenblas 0.3.23 openmp_hc731615_0 conda-forge\n",
"libopus 1.3.1 h27ca646_1 conda-forge\n",
"libpng 1.6.39 h76d750c_0 conda-forge\n",
"libpq 15.3 h7126958_1 conda-forge\n",
"libprotobuf 4.23.3 hf32f9b9_0 conda-forge\n",
"libsodium 1.0.18 h27ca646_1 conda-forge\n",
"libsqlite 3.42.0 hb31c410_0 conda-forge\n",
"libssh2 1.11.0 h7a5bd25_0 conda-forge\n",
"libthrift 0.18.1 ha061701_2 conda-forge\n",
"libtiff 4.5.1 h23a1a89_0 conda-forge\n",
"libutf8proc 2.8.0 h1a8c8d9_0 conda-forge\n",
"libuv 1.44.2 he4db4b2_0 conda-forge\n",
"libvorbis 1.3.7 h9f76cd9_0 conda-forge\n",
"libwebp-base 1.3.1 hb547adb_0 conda-forge\n",
"libxcb 1.15 hf346824_0 conda-forge\n",
"libxml2 2.11.4 he3bdae6_0 conda-forge\n",
"libzip 1.9.2 h76ab92c_1 conda-forge\n",
"libzlib 1.2.13 h53f4e23_5 conda-forge\n",
"libzopfli 1.0.3 h9f76cd9_0 conda-forge\n",
"llvm-openmp 16.0.6 h1c12783_0 conda-forge\n",
"llvmlite 0.40.1 py310h95b248a_0 conda-forge\n",
"locket 1.0.0 pyhd8ed1ab_0 conda-forge\n",
"lz4 4.3.2 py310ha6df754_0 conda-forge\n",
"lz4-c 1.9.4 hb7217d7_0 conda-forge\n",
"magicgui 0.7.2 pyhd8ed1ab_0 conda-forge\n",
"markdown 3.4.3 pypi_0 pypi\n",
"markdown-it-py 3.0.0 pyhd8ed1ab_0 conda-forge\n",
"markupsafe 2.1.3 py310h2aa6e3c_0 conda-forge\n",
"matplotlib 3.7.2 py310hb6292c7_0 conda-forge\n",
"matplotlib-base 3.7.2 py310h49faba3_0 conda-forge\n",
"matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge\n",
"mdurl 0.1.0 pyhd8ed1ab_0 conda-forge\n",
"meshio 5.3.4 pyhd8ed1ab_0 conda-forge\n",
"metis 5.1.0 h9f76cd9_1006 conda-forge\n",
"mistune 3.0.0 pyhd8ed1ab_0 conda-forge\n",
"mpfr 4.2.0 he09a6ba_0 conda-forge\n",
"mrcfile 1.4.3 pyhd8ed1ab_0 conda-forge\n",
"msgpack-python 1.0.5 py310h2887b22_0 conda-forge\n",
"multidict 6.0.4 pypi_0 pypi\n",
"munkres 1.1.4 pyh9f0ad1d_0 conda-forge\n",
"mypy_extensions 1.0.0 pyha770c72_0 conda-forge\n",
"mysql-common 8.0.33 h7b5afe1_1 conda-forge\n",
"mysql-libs 8.0.33 hb292caa_1 conda-forge\n",
"napari 0.5.0a2.dev243+g4e08272e pypi_0 pypi\n",
"napari-animation 0.0.7 pypi_0 pypi\n",
"napari-clusters-plotter 0.7.2 pyhd8ed1ab_0 conda-forge\n",
"napari-console 0.0.8 pyhd8ed1ab_0 conda-forge\n",
"napari-meshio 0.0.1 pyhd8ed1ab_0 conda-forge\n",
"napari-plugin-engine 0.2.0 pyhd8ed1ab_2 conda-forge\n",
"napari-skimage-regionprops 0.10.1 pyhd8ed1ab_0 conda-forge\n",
"napari-svg 0.1.10 pyhd8ed1ab_0 conda-forge\n",
"napari-tools-menu 0.1.19 pyhd8ed1ab_0 conda-forge\n",
"napari-workflows 0.2.9 pyhd8ed1ab_0 conda-forge\n",
"nbclassic 1.0.0 pyhb4ecaf3_1 conda-forge\n",
"nbclient 0.8.0 pyhd8ed1ab_0 conda-forge\n",
"nbconvert 7.6.0 pyhd8ed1ab_0 conda-forge\n",
"nbconvert-core 7.6.0 pyhd8ed1ab_0 conda-forge\n",
"nbconvert-pandoc 7.6.0 pyhd8ed1ab_0 conda-forge\n",
"nbformat 5.9.1 pyhd8ed1ab_0 conda-forge\n",
"ncurses 6.4 h7ea286d_0 conda-forge\n",
"nest-asyncio 1.5.6 pyhd8ed1ab_0 conda-forge\n",
"netcdf4 1.6.4 nompi_py310h75c7371_101 conda-forge\n",
"networkx 3.1 pyhd8ed1ab_0 conda-forge\n",
"nodejs 18.16.1 ha2ed473_0 conda-forge\n",
"notebook 6.5.4 pyha770c72_0 conda-forge\n",
"notebook-shim 0.2.3 pyhd8ed1ab_0 conda-forge\n",
"npe2 0.7.0 pyhd8ed1ab_0 conda-forge\n",
"nspr 4.35 hb7217d7_0 conda-forge\n",
"nss 3.89 h789eff7_0 conda-forge\n",
"numba 0.57.1 py310hb9b3264_0 conda-forge\n",
"numcodecs 0.11.0 py310h0f1eb42_1 conda-forge\n",
"numpy 1.23.5 py310h5d7c261_0 conda-forge\n",
"numpydoc 1.5.0 pyhd8ed1ab_0 conda-forge\n",
"oauthlib 3.2.2 pypi_0 pypi\n",
"openjpeg 2.5.0 hbc2ba62_2 conda-forge\n",
"openssl 3.1.1 h53f4e23_1 conda-forge\n",
"opt-einsum 3.3.0 pypi_0 pypi\n",
"orc 1.9.0 h858f345_1 conda-forge\n",
"overrides 7.3.1 pyhd8ed1ab_0 conda-forge\n",
"packaging 23.1 pyhd8ed1ab_0 conda-forge\n",
"pandas 2.0.3 py310h1cdf563_1 conda-forge\n",
"pandoc 3.1.3 hce30654_0 conda-forge\n",
"pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge\n",
"parso 0.8.3 pyhd8ed1ab_0 conda-forge\n",
"partd 1.4.0 pyhd8ed1ab_0 conda-forge\n",
"pcre2 10.40 hb34f9b4_0 conda-forge\n",
"pexpect 4.8.0 pyh1a96a4e_2 conda-forge\n",
"pickleshare 0.7.5 py_1003 conda-forge\n",
"pillow 10.0.0 py310h60ecbdf_0 conda-forge\n",
"pint 0.22 pyhd8ed1ab_1 conda-forge\n",
"pip 23.1.2 pyhd8ed1ab_0 conda-forge\n",
"pkgutil-resolve-name 1.3.10 pyhd8ed1ab_0 conda-forge\n",
"platformdirs 3.8.1 pyhd8ed1ab_0 conda-forge\n",
"ply 3.11 py_1 conda-forge\n",
"pooch 1.7.0 pyha770c72_3 conda-forge\n",
"prometheus_client 0.17.1 pyhd8ed1ab_0 conda-forge\n",
"prompt-toolkit 3.0.39 pyha770c72_0 conda-forge\n",
"prompt_toolkit 3.0.39 hd8ed1ab_0 conda-forge\n",
"protobuf 4.23.4 pypi_0 pypi\n",
"psutil 5.9.5 py310h8e9501a_0 conda-forge\n",
"psygnal 0.9.1 pyhd8ed1ab_0 conda-forge\n",
"pthread-stubs 0.4 h27ca646_1001 conda-forge\n",
"ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge\n",
"pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge\n",
"pyarrow 12.0.1 py310hfbab16f_4_cpu conda-forge\n",
"pyasn1 0.5.0 pypi_0 pypi\n",
"pyasn1-modules 0.3.0 pypi_0 pypi\n",
"pycodestyle 2.10.0 pyhd8ed1ab_0 conda-forge\n",
"pycparser 2.21 pyhd8ed1ab_0 conda-forge\n",
"pydantic 1.10.10 py310h2aa6e3c_0 conda-forge\n",
"pygfx 0.1.13 pypi_0 pypi\n",
"pygments 2.15.1 pyhd8ed1ab_0 conda-forge\n",
"pylinalg 0.4.1 pypi_0 pypi\n",
"pynndescent 0.5.10 pyh1a96a4e_0 conda-forge\n",
"pyobjc-core 9.2 py310hd07e440_0 conda-forge\n",
"pyobjc-framework-cocoa 9.2 py310hd07e440_0 conda-forge\n",
"pyopengl 3.1.6 pyhd8ed1ab_1 conda-forge\n",
"pyparsing 3.0.9 pyhd8ed1ab_0 conda-forge\n",
"pyproject_hooks 1.0.0 pyhd8ed1ab_0 conda-forge\n",
"pyqt 5.15.7 py310h7aaa74b_3 conda-forge\n",
"pyqt5-sip 12.11.0 py310h0f1eb42_3 conda-forge\n",
"pysocks 1.7.1 pyha2e5f31_6 conda-forge\n",
"python 3.10.12 h01493a6_0_cpython conda-forge\n",
"python-build 0.10.0 pyhd8ed1ab_1 conda-forge\n",
"python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge\n",
"python-fastjsonschema 2.17.1 pyhd8ed1ab_0 conda-forge\n",
"python-json-logger 2.0.7 pyhd8ed1ab_0 conda-forge\n",
"python-tzdata 2023.3 pyhd8ed1ab_0 conda-forge\n",
"python-wget 3.2 py_0 conda-forge\n",
"python_abi 3.10 3_cp310 conda-forge\n",
"pytomlpp 1.0.13 py310h2887b22_0 conda-forge\n",
"pytz 2023.3 pyhd8ed1ab_0 conda-forge\n",
"pywavelets 1.4.1 py310hf1a086a_0 conda-forge\n",
"pyyaml 6.0 py310h8e9501a_5 conda-forge\n",
"pyzmq 25.1.0 py310h30b7201_0 conda-forge\n",
"qt-main 5.15.8 hcac2fde_14 conda-forge\n",
"qtconsole-base 5.4.3 pyha770c72_0 conda-forge\n",
"qtpy 2.3.1 pyhd8ed1ab_0 conda-forge\n",
"re2 2023.03.02 hc5e2d97_0 conda-forge\n",
"readline 8.2 h92ec313_1 conda-forge\n",
"referencing 0.29.1 pyhd8ed1ab_0 conda-forge\n",
"requests 2.31.0 pyhd8ed1ab_0 conda-forge\n",
"requests-oauthlib 1.3.1 pypi_0 pypi\n",
"rfc3339-validator 0.1.4 pyhd8ed1ab_0 conda-forge\n",
"rfc3986-validator 0.1.1 pyh9f0ad1d_0 conda-forge\n",
"rich 13.4.2 pyhd8ed1ab_0 conda-forge\n",
"rpds-py 0.8.10 py310had9acf8_0 conda-forge\n",
"rsa 4.9 pypi_0 pypi\n",
"rubicon-objc 0.4.6 pypi_0 pypi\n",
"scikit-image 0.21.0 py310h1253130_0 conda-forge\n",
"scikit-learn 1.3.0 py310h02d4e2a_0 conda-forge\n",
"scipy 1.11.1 py310h0975f3d_0 conda-forge\n",
"send2trash 1.8.2 pyhd1c38e8_0 conda-forge\n",
"setuptools 68.0.0 pyhd8ed1ab_0 conda-forge\n",
"shellingham 1.5.1 pyhd8ed1ab_0 conda-forge\n",
"simpervisor 1.0.0 pypi_0 pypi\n",
"simplejpeg 1.6.6 pypi_0 pypi\n",
"sip 6.7.9 py310h1253130_0 conda-forge\n",
"six 1.16.0 pyh6c4a22f_0 conda-forge\n",
"snappy 1.1.10 h17c5cce_0 conda-forge\n",
"sniffio 1.3.0 pyhd8ed1ab_0 conda-forge\n",
"snowballstemmer 2.2.0 pyhd8ed1ab_0 conda-forge\n",
"sortedcontainers 2.4.0 pyhd8ed1ab_0 conda-forge\n",
"soupsieve 2.3.2.post1 pyhd8ed1ab_0 conda-forge\n",
"sphinx 4.5.0 pyh6c4a22f_0 conda-forge\n",
"sphinxcontrib-applehelp 1.0.4 pyhd8ed1ab_0 conda-forge\n",
"sphinxcontrib-devhelp 1.0.2 py_0 conda-forge\n",
"sphinxcontrib-htmlhelp 2.0.1 pyhd8ed1ab_0 conda-forge\n",
"sphinxcontrib-jsmath 1.0.1 py_0 conda-forge\n",
"sphinxcontrib-qthelp 1.0.3 py_0 conda-forge\n",
"sphinxcontrib-serializinghtml 1.1.5 pyhd8ed1ab_2 conda-forge\n",
"stack_data 0.6.2 pyhd8ed1ab_0 conda-forge\n",
"stardist 0.8.3 pypi_0 pypi\n",
"stardist-napari 2022.12.6 pypi_0 pypi\n",
"starfile 0.4.12 pyhd8ed1ab_0 conda-forge\n",
"suitesparse 5.10.1 h7cd81ec_1 conda-forge\n",
"superqt 0.4.1 pyhd8ed1ab_0 conda-forge\n",
"tbb 2021.9.0 hffc8910_0 conda-forge\n",
"tblib 1.7.0 pyhd8ed1ab_0 conda-forge\n",
"tensorboard 2.13.0 pypi_0 pypi\n",
"tensorboard-data-server 0.7.1 pypi_0 pypi\n",
"tensorflow-estimator 2.13.0 pypi_0 pypi\n",
"tensorflow-macos 2.13.0 pypi_0 pypi\n",
"tensorflow-metal 1.0.1 pypi_0 pypi\n",
"termcolor 2.3.0 pypi_0 pypi\n",
"terminado 0.17.1 pyhd1c38e8_0 conda-forge\n",
"threadpoolctl 3.1.0 pyh8a188c0_0 conda-forge\n",
"tifffile 2023.7.4 pyhd8ed1ab_0 conda-forge\n",
"tinycss2 1.2.1 pyhd8ed1ab_0 conda-forge\n",
"tk 8.6.12 he1e0b03_0 conda-forge\n",
"toml 0.10.2 pyhd8ed1ab_0 conda-forge\n",
"tomli 2.0.1 pyhd8ed1ab_0 conda-forge\n",
"toolz 0.12.0 pyhd8ed1ab_0 conda-forge\n",
"tornado 6.3.2 py310h2aa6e3c_0 conda-forge\n",
"tqdm 4.65.0 pyhd8ed1ab_1 conda-forge\n",
"traitlets 5.9.0 pyhd8ed1ab_0 conda-forge\n",
"typer 0.9.0 pyhd8ed1ab_0 conda-forge\n",
"typing-extensions 4.5.0 pypi_0 pypi\n",
"typing_extensions 4.7.1 pyha770c72_0 conda-forge\n",
"typing_utils 0.1.0 pyhd8ed1ab_0 conda-forge\n",
"tzdata 2023c h71feb2d_0 conda-forge\n",
"uharfbuzz 0.37.1.post1 pypi_0 pypi\n",
"umap-learn 0.5.3 py310hbe9552e_1 conda-forge\n",
"unicodedata2 15.0.0 py310h8e9501a_0 conda-forge\n",
"uri-template 1.3.0 pypi_0 pypi\n",
"urllib3 1.26.16 pypi_0 pypi\n",
"vispy 0.13.0 pypi_0 pypi\n",
"wcwidth 0.2.6 pyhd8ed1ab_0 conda-forge\n",
"webcolors 1.13 pypi_0 pypi\n",
"webencodings 0.5.1 py_1 conda-forge\n",
"websocket-client 1.6.1 pyhd8ed1ab_0 conda-forge\n",
"werkzeug 2.3.6 pypi_0 pypi\n",
"wgpu 0.9.4 pypi_0 pypi\n",
"wheel 0.40.0 pyhd8ed1ab_0 conda-forge\n",
"widgetsnbextension 4.0.8 pyhd8ed1ab_0 conda-forge\n",
"wrapt 1.15.0 py310h8e9501a_0 conda-forge\n",
"xorg-libxau 1.0.11 hb547adb_0 conda-forge\n",
"xorg-libxdmcp 1.1.3 h27ca646_0 conda-forge\n",
"xyzservices 2023.5.0 pyhd8ed1ab_1 conda-forge\n",
"xz 5.2.6 h57fd34a_0 conda-forge\n",
"yaml 0.2.5 h3422bc3_2 conda-forge\n",
"yarl 1.9.2 pypi_0 pypi\n",
"zarr 2.15.0 pyhd8ed1ab_0 conda-forge\n",
"zenodo_get 1.3.4 pyhd8ed1ab_0 conda-forge\n",
"zeromq 4.3.4 hbdafb3b_1 conda-forge\n",
"zfp 1.0.0 hb6e4faa_3 conda-forge\n",
"zict 3.0.0 pyhd8ed1ab_0 conda-forge\n",
"zipp 3.16.0 pyhd8ed1ab_1 conda-forge\n",
"zlib 1.2.13 h53f4e23_5 conda-forge\n",
"zlib-ng 2.0.7 h1a8c8d9_0 conda-forge\n",
"zstd 1.5.2 h4f39d0f_7 conda-forge\n"
]
}
],
"source": [
"!conda list"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a1c4fcf4-f34f-4448-a27f-f29176768cd4",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment