Skip to content

Instantly share code, notes, and snippets.

@GenevieveBuckley
Last active March 3, 2023 12:43
Show Gist options
  • Save GenevieveBuckley/4ad4282038a9ec49e548898c78d3b590 to your computer and use it in GitHub Desktop.
Save GenevieveBuckley/4ad4282038a9ec49e548898c78d3b590 to your computer and use it in GitHub Desktop.
ITK + Dask notebooks (August 2022)
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "c7f60750",
"metadata": {},
"outputs": [],
"source": [
"import itk\n",
"import numpy as np\n",
"import skimage.restoration"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "fe6a0227",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"(101, 64, 64)\n"
]
}
],
"source": [
"import tifffile\n",
"\n",
"psf_filename = \"psfs_z0p1/PSF_488nm_dz100nm.tif\"\n",
"psf = tifffile.imread(psf_filename).astype(float)\n",
"print(psf.shape)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4b6bb607",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <td>\n",
" <table>\n",
" <thead>\n",
" <tr>\n",
" <td> </td>\n",
" <th> Array </th>\n",
" <th> Chunk </th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" \n",
" <tr>\n",
" <th> Bytes </th>\n",
" <td> 234.37 GiB </td>\n",
" <td> 1.18 GiB </td>\n",
" </tr>\n",
" \n",
" <tr>\n",
" <th> Shape </th>\n",
" <td> (199, 201, 1024, 768) </td>\n",
" <td> (1, 201, 1024, 768) </td>\n",
" </tr>\n",
" <tr>\n",
" <th> Count </th>\n",
" <td> 398 Tasks </td>\n",
" <td> 199 Chunks </td>\n",
" </tr>\n",
" <tr>\n",
" <th> Type </th>\n",
" <td> float64 </td>\n",
" <td> numpy.ndarray </td>\n",
" </tr>\n",
" </tbody>\n",
" </table>\n",
" </td>\n",
" <td>\n",
" <svg width=\"386\" height=\"194\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n",
"\n",
" <!-- Horizontal lines -->\n",
" <line x1=\"0\" y1=\"0\" x2=\"41\" y2=\"0\" style=\"stroke-width:2\" />\n",
" <line x1=\"0\" y1=\"25\" x2=\"41\" y2=\"25\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Vertical lines -->\n",
" <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n",
" <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"25\" />\n",
" <line x1=\"2\" y1=\"0\" x2=\"2\" y2=\"25\" />\n",
" <line x1=\"3\" y1=\"0\" x2=\"3\" y2=\"25\" />\n",
" <line x1=\"5\" y1=\"0\" x2=\"5\" y2=\"25\" />\n",
" <line x1=\"6\" y1=\"0\" x2=\"6\" y2=\"25\" />\n",
" <line x1=\"7\" y1=\"0\" x2=\"7\" y2=\"25\" />\n",
" <line x1=\"9\" y1=\"0\" x2=\"9\" y2=\"25\" />\n",
" <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"25\" />\n",
" <line x1=\"11\" y1=\"0\" x2=\"11\" y2=\"25\" />\n",
" <line x1=\"13\" y1=\"0\" x2=\"13\" y2=\"25\" />\n",
" <line x1=\"14\" y1=\"0\" x2=\"14\" y2=\"25\" />\n",
" <line x1=\"15\" y1=\"0\" x2=\"15\" y2=\"25\" />\n",
" <line x1=\"16\" y1=\"0\" x2=\"16\" y2=\"25\" />\n",
" <line x1=\"18\" y1=\"0\" x2=\"18\" y2=\"25\" />\n",
" <line x1=\"19\" y1=\"0\" x2=\"19\" y2=\"25\" />\n",
" <line x1=\"20\" y1=\"0\" x2=\"20\" y2=\"25\" />\n",
" <line x1=\"22\" y1=\"0\" x2=\"22\" y2=\"25\" />\n",
" <line x1=\"23\" y1=\"0\" x2=\"23\" y2=\"25\" />\n",
" <line x1=\"24\" y1=\"0\" x2=\"24\" y2=\"25\" />\n",
" <line x1=\"26\" y1=\"0\" x2=\"26\" y2=\"25\" />\n",
" <line x1=\"27\" y1=\"0\" x2=\"27\" y2=\"25\" />\n",
" <line x1=\"28\" y1=\"0\" x2=\"28\" y2=\"25\" />\n",
" <line x1=\"30\" y1=\"0\" x2=\"30\" y2=\"25\" />\n",
" <line x1=\"31\" y1=\"0\" x2=\"31\" y2=\"25\" />\n",
" <line x1=\"32\" y1=\"0\" x2=\"32\" y2=\"25\" />\n",
" <line x1=\"33\" y1=\"0\" x2=\"33\" y2=\"25\" />\n",
" <line x1=\"35\" y1=\"0\" x2=\"35\" y2=\"25\" />\n",
" <line x1=\"36\" y1=\"0\" x2=\"36\" y2=\"25\" />\n",
" <line x1=\"37\" y1=\"0\" x2=\"37\" y2=\"25\" />\n",
" <line x1=\"39\" y1=\"0\" x2=\"39\" y2=\"25\" />\n",
" <line x1=\"40\" y1=\"0\" x2=\"40\" y2=\"25\" />\n",
" <line x1=\"41\" y1=\"0\" x2=\"41\" y2=\"25\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Colored Rectangle -->\n",
" <polygon points=\"0.0,0.0 41.88758677146205,0.0 41.88758677146205,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#8B4903A0;stroke-width:0\"/>\n",
"\n",
" <!-- Text -->\n",
" <text x=\"20.943793\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >199</text>\n",
" <text x=\"61.887587\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,61.887587,12.706308)\">1</text>\n",
"\n",
"\n",
" <!-- Horizontal lines -->\n",
" <line x1=\"111\" y1=\"0\" x2=\"135\" y2=\"24\" style=\"stroke-width:2\" />\n",
" <line x1=\"111\" y1=\"120\" x2=\"135\" y2=\"144\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Vertical lines -->\n",
" <line x1=\"111\" y1=\"0\" x2=\"111\" y2=\"120\" style=\"stroke-width:2\" />\n",
" <line x1=\"135\" y1=\"24\" x2=\"135\" y2=\"144\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Colored Rectangle -->\n",
" <polygon points=\"111.0,0.0 135.66491790838793,24.664917908387924 135.66491790838793,144.66491790838793 111.0,120.0\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
"\n",
" <!-- Horizontal lines -->\n",
" <line x1=\"111\" y1=\"0\" x2=\"201\" y2=\"0\" style=\"stroke-width:2\" />\n",
" <line x1=\"135\" y1=\"24\" x2=\"225\" y2=\"24\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Vertical lines -->\n",
" <line x1=\"111\" y1=\"0\" x2=\"135\" y2=\"24\" style=\"stroke-width:2\" />\n",
" <line x1=\"201\" y1=\"0\" x2=\"225\" y2=\"24\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Colored Rectangle -->\n",
" <polygon points=\"111.0,0.0 201.0,0.0 225.66491790838793,24.664917908387924 135.66491790838793,24.664917908387924\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
"\n",
" <!-- Horizontal lines -->\n",
" <line x1=\"135\" y1=\"24\" x2=\"225\" y2=\"24\" style=\"stroke-width:2\" />\n",
" <line x1=\"135\" y1=\"144\" x2=\"225\" y2=\"144\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Vertical lines -->\n",
" <line x1=\"135\" y1=\"24\" x2=\"135\" y2=\"144\" style=\"stroke-width:2\" />\n",
" <line x1=\"225\" y1=\"24\" x2=\"225\" y2=\"144\" style=\"stroke-width:2\" />\n",
"\n",
" <!-- Colored Rectangle -->\n",
" <polygon points=\"135.6649179083879,24.664917908387924 225.6649179083879,24.664917908387924 225.6649179083879,144.66491790838793 135.6649179083879,144.66491790838793\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
"\n",
" <!-- Text -->\n",
" <text x=\"180.664918\" y=\"164.664918\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >768</text>\n",
" <text x=\"245.664918\" y=\"84.664918\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,245.664918,84.664918)\">1024</text>\n",
" <text x=\"113.332459\" y=\"152.332459\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,113.332459,152.332459)\">201</text>\n",
"</svg>\n",
" </td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"dask.array<astype, shape=(199, 201, 1024, 768), dtype=float64, chunksize=(1, 201, 1024, 768), chunktype=numpy.ndarray>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from dask.array.image import imread\n",
"\n",
"raw_filename = \"raw-488nm/*.tif\"\n",
"imgs = imread(raw_filename).astype(float)\n",
"imgs"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c7df9f60",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n",
"TiffTag 32781: coercing invalid ASCII to bytes\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"(200, 200, 200)\n"
]
}
],
"source": [
"img = imgs[0,:200,:200,:200].compute()\n",
"print(img.shape)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "90e0cf98",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"float64\n",
"float64\n",
"float64\n"
]
}
],
"source": [
"print(psf.dtype)\n",
"print(img.dtype)\n",
"print(imgs.dtype)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "82e43a66",
"metadata": {
"scrolled": false
},
"outputs": [
{
"ename": "RuntimeError",
"evalue": "No suitable template parameter can be found.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [8]\u001b[0m, in \u001b[0;36m<cell line: 13>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m iterations \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 7\u001b[0m deconvolved \u001b[38;5;241m=\u001b[39m itk\u001b[38;5;241m.\u001b[39mrichardson_lucy_deconvolution_image_filter(\n\u001b[1;32m 8\u001b[0m img, \n\u001b[1;32m 9\u001b[0m kernel_image\u001b[38;5;241m=\u001b[39mpsf,\n\u001b[1;32m 10\u001b[0m number_of_iterations\u001b[38;5;241m=\u001b[39miterations,\n\u001b[1;32m 11\u001b[0m )\n\u001b[0;32m---> 13\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mitk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray_from_image\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdeconvolved\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Convert back to Numpy array\u001b[39;00m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(result\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdone\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
"File \u001b[0;32m~/em95/miniconda/conda/envs/itk-dask/lib/python3.10/site-packages/itk/support/extras.py:327\u001b[0m, in \u001b[0;36mGetArrayFromImage\u001b[0;34m(image_or_filter, keep_axes, update, ttype)\u001b[0m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mGetArrayFromImage\u001b[39m(\n\u001b[1;32m 321\u001b[0m image_or_filter: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mitkt.ImageOrImageSource\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 322\u001b[0m keep_axes: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 323\u001b[0m update: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 324\u001b[0m ttype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 325\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m np\u001b[38;5;241m.\u001b[39mndarray:\n\u001b[1;32m 326\u001b[0m \u001b[38;5;124;03m\"\"\"Get an array with the content of the image buffer\"\"\"\u001b[39;00m\n\u001b[0;32m--> 327\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_GetArrayFromImage\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 328\u001b[0m \u001b[43m \u001b[49m\u001b[43mimage_or_filter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mGetArrayFromImage\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeep_axes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mupdate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mttype\u001b[49m\n\u001b[1;32m 329\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/em95/miniconda/conda/envs/itk-dask/lib/python3.10/site-packages/itk/support/extras.py:314\u001b[0m, in \u001b[0;36m_GetArrayFromImage\u001b[0;34m(image_or_filter, function_name, keep_axes, update, ttype)\u001b[0m\n\u001b[1;32m 312\u001b[0m keys \u001b[38;5;241m=\u001b[39m [k \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m itk\u001b[38;5;241m.\u001b[39mPyBuffer\u001b[38;5;241m.\u001b[39mkeys() \u001b[38;5;28;01mif\u001b[39;00m k[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m ImageType]\n\u001b[1;32m 313\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(keys) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 314\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo suitable template parameter can be found.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 315\u001b[0m \u001b[38;5;66;03m# Create a numpy array of the type of the input image\u001b[39;00m\n\u001b[1;32m 316\u001b[0m templatedFunction \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(itk\u001b[38;5;241m.\u001b[39mPyBuffer[keys[\u001b[38;5;241m0\u001b[39m]], function_name)\n",
"\u001b[0;31mRuntimeError\u001b[0m: No suitable template parameter can be found."
]
}
],
"source": [
"# itk richardson-lucy deconvolution\n",
"\n",
"image = itk.image_view_from_array(img) # Convert to ITK object\n",
"kernel = itk.image_view_from_array(psf) # Convert to ITK object\n",
"iterations = 1\n",
"\n",
"deconvolved = itk.richardson_lucy_deconvolution_image_filter(\n",
" img, \n",
" kernel_image=psf,\n",
" number_of_iterations=iterations,\n",
")\n",
"\n",
"result = itk.array_from_image(deconvolved) # Convert back to Numpy array\n",
"print(result.shape)\n",
"print('done')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "11cd537d",
"metadata": {},
"outputs": [],
"source": [
"result = itk.array_from_image(deconvolved_RL) # Convert back to Numpy array\n",
"print(result.shape)\n",
"print('done')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f0e02761",
"metadata": {},
"outputs": [],
"source": [
"import dask.array as da\n",
"import itk\n",
"import numpy as np\n",
"\n",
"\n",
"iterations = 1\n",
"deconvolved = da.map_blocks(\n",
" itk.richardson_lucy_deconvolution_image_filter,\n",
" imgs, \n",
" kernel_image=psf,\n",
" number_of_iterations=iterations,\n",
" dtype=np.float32,\n",
")\n",
"deconvolved"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3c5d576a",
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"deconvolved_result = deconvolved.compute()\n",
"print(deconvolved_result.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2b05c819",
"metadata": {},
"outputs": [],
"source": [
"# uint16 input\n",
"# TypeError: Expecting argument of type itkImageD4 or itkImageSourceID4."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "49430b58",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "b2ad9274",
"metadata": {},
"outputs": [],
"source": [
"img_size = (200, 200, 200)\n",
"psf_size = (12, 100, 100)\n",
"\n",
"img = np.random.random(img_size)\n",
"psf = np.ones(psf_size) / np.prod(psf_size)\n",
"\n",
"print(img.shape)\n",
"print(psf.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "818fceae",
"metadata": {},
"outputs": [],
"source": [
"# itk richardson-lucy deconvolution\n",
"\n",
"image = itk.image_view_from_array(img) # Convert to ITK object\n",
"kernel = itk.image_view_from_array(psf) # Convert to ITK object\n",
"iterations = 1\n",
"\n",
"deconvolved = itk.richardson_lucy_deconvolution_image_filter(\n",
" image,\n",
" kernel_image=kernel,\n",
" number_of_iterations=iterations\n",
")\n",
"\n",
"result = itk.array_from_image(deconvolved) # Convert back to Numpy array\n",
"print('done')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "84aeae95",
"metadata": {},
"outputs": [],
"source": [
"print(result.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "30d69859",
"metadata": {},
"outputs": [],
"source": [
"import dask.array as da\n",
"\n",
"imgs = da.from_array(img, chunks=(50,100,100))\n",
"imgs"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c0f5332d",
"metadata": {},
"outputs": [],
"source": [
"deconvolved = da.map_blocks(\n",
" itk.richardson_lucy_deconvolution_image_filter,\n",
" imgs, \n",
" kernel_image=kernel,\n",
" number_of_iterations=iterations,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "760d036f",
"metadata": {},
"outputs": [],
"source": [
"import napari\n",
"\n",
"viewer = napari.Viewer()\n",
"viewer.add_image(result)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "26f63107",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "e1b4098a",
"metadata": {},
"outputs": [],
"source": [
"# itk richardson-lucy deconvolution\n",
"deconvolved = itk.RichardsonLucyDeconvolutionImageFilter(img, kernel_image=psf, number_of_iterations=1)\n",
"print(deconvolved.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b96ec5ea",
"metadata": {},
"outputs": [],
"source": [
"# scikit-image richardson-lucy deconvolution\n",
"deconvolved_RL = skimage.restoration.richardson_lucy(img, psf, num_iter=30)\n",
"print(deconvolved_RL.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8a8162e4",
"metadata": {},
"outputs": [],
"source": [
"del deconvolved_RL"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fde84656",
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment