From df8a4fbda07b8ab8476b1c034859a0c76dc6dcb5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 22:25:06 +0000 Subject: [PATCH 1/2] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.0.1 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.0.1...v6.0.0) - [github.com/asottile/setup-cfg-fmt: v1.19.0 → v3.2.0](https://github.com/asottile/setup-cfg-fmt/compare/v1.19.0...v3.2.0) - [github.com/PyCQA/flake8: 4.0.1 → 7.3.0](https://github.com/PyCQA/flake8/compare/4.0.1...7.3.0) - https://github.com/myint/autoflake → https://github.com/PyCQA/autoflake - [github.com/PyCQA/autoflake: v1.4 → v2.3.3](https://github.com/PyCQA/autoflake/compare/v1.4...v2.3.3) - [github.com/PyCQA/isort: 5.9.3 → 9.0.0a3](https://github.com/PyCQA/isort/compare/5.9.3...9.0.0a3) - https://github.com/psf/black → https://github.com/psf/black-pre-commit-mirror - [github.com/psf/black-pre-commit-mirror: 21.10b0 → 26.5.1](https://github.com/psf/black-pre-commit-mirror/compare/21.10b0...26.5.1) - [github.com/asottile/pyupgrade: v2.29.0 → v3.21.2](https://github.com/asottile/pyupgrade/compare/v2.29.0...v3.21.2) - [github.com/pre-commit/mirrors-clang-format: v13.0.0 → v22.1.5](https://github.com/pre-commit/mirrors-clang-format/compare/v13.0.0...v22.1.5) --- .pre-commit-config.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 48241fa..0fcfc10 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,39 +2,39 @@ ci: autoupdate_schedule: 'quarterly' repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.0.1 + rev: v6.0.0 hooks: - id: check-docstring-first - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/asottile/setup-cfg-fmt - rev: v1.19.0 + rev: v3.2.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/PyCQA/flake8 - rev: 4.0.1 + rev: 7.3.0 hooks: - id: flake8 additional_dependencies: [flake8-typing-imports==1.7.0] - - repo: https://github.com/myint/autoflake - rev: v1.4 + - repo: https://github.com/PyCQA/autoflake + rev: v2.3.3 hooks: - id: autoflake args: ["--in-place", "--remove-all-unused-imports", "--ignore-init-module-imports", "--remove-unused-variables"] - repo: https://github.com/PyCQA/isort - rev: 5.9.3 + rev: 9.0.0a3 hooks: - id: isort - - repo: https://github.com/psf/black - rev: 21.10b0 + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 26.5.1 hooks: - id: black - repo: https://github.com/asottile/pyupgrade - rev: v2.29.0 + rev: v3.21.2 hooks: - id: pyupgrade args: [--py37-plus] - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v13.0.0 + rev: v22.1.5 hooks: - id: clang-format From 9c07d2333621ec421cf5321379798091420f45cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 22:25:19 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- examples/Untitled.ipynb | 1400 +++++++++++++++++++-------------------- setup.cfg | 2 +- 2 files changed, 701 insertions(+), 701 deletions(-) diff --git a/examples/Untitled.ipynb b/examples/Untitled.ipynb index 5d55214..446d25d 100644 --- a/examples/Untitled.ipynb +++ b/examples/Untitled.ipynb @@ -1,743 +1,743 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "completed-pound", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:11:41.739896Z", - "iopub.status.busy": "2021-10-14T04:11:41.738945Z", - "iopub.status.idle": "2021-10-14T04:11:42.106907Z", - "shell.execute_reply": "2021-10-14T04:11:42.106334Z", - "shell.execute_reply.started": "2021-10-14T04:11:41.739750Z" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "%matplotlib widget\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "growing-series", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:11:42.107707Z", - "iopub.status.busy": "2021-10-14T04:11:42.107513Z", - "iopub.status.idle": "2021-10-14T04:11:42.571200Z", - "shell.execute_reply": "2021-10-14T04:11:42.570618Z", - "shell.execute_reply.started": "2021-10-14T04:11:42.107690Z" + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "completed-pound", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:11:41.739896Z", + "iopub.status.busy": "2021-10-14T04:11:41.738945Z", + "iopub.status.idle": "2021-10-14T04:11:42.106907Z", + "shell.execute_reply": "2021-10-14T04:11:42.106334Z", + "shell.execute_reply.started": "2021-10-14T04:11:41.739750Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "%matplotlib widget\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] }, - "tags": [] - }, - "outputs": [], - "source": [ - "# np.zeros()\n", - "from skimage.draw import random_shapes\n", - "from skimage.segmentation import relabel_sequential" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "further-cleaning", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:12:45.212252Z", - "iopub.status.busy": "2021-10-14T04:12:45.211675Z", - "iopub.status.idle": "2021-10-14T04:12:45.573263Z", - "shell.execute_reply": "2021-10-14T04:12:45.572822Z", - "shell.execute_reply.started": "2021-10-14T04:12:45.212208Z" + { + "cell_type": "code", + "execution_count": 2, + "id": "growing-series", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:11:42.107707Z", + "iopub.status.busy": "2021-10-14T04:11:42.107513Z", + "iopub.status.idle": "2021-10-14T04:11:42.571200Z", + "shell.execute_reply": "2021-10-14T04:11:42.570618Z", + "shell.execute_reply.started": "2021-10-14T04:11:42.107690Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# np.zeros()\n", + "from skimage.draw import random_shapes\n", + "from skimage.segmentation import relabel_sequential" + ] }, - "tags": [] - }, - "outputs": [ { - "data": { - "text/plain": [ - "" + "cell_type": "code", + "execution_count": 4, + "id": "further-cleaning", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:12:45.212252Z", + "iopub.status.busy": "2021-10-14T04:12:45.211675Z", + "iopub.status.idle": "2021-10-14T04:12:45.573263Z", + "shell.execute_reply": "2021-10-14T04:12:45.572822Z", + "shell.execute_reply.started": "2021-10-14T04:12:45.212208Z" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "042721c850864044a44ce53c336abbc0", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMR0lEQVR4nO3deXxU9aH+8efMmn1MCCQEAgaFioKKoChS0YK4IW4Vqoh6i79qVTRFK3rtYr0WxFZsK61evV7xuhS7iNUWlajIvhlAVkEBWRPDEib7zGTm/P6wTBv2bHNm5nzer1f+YOabOc8cIPPke875HsM0TVMAAACwDYfVAQAAABBbFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiANvaHP/xBRUVFSklJUf/+/TV//nyrIwEAgBigANrUm2++qeLiYj366KNauXKlvv3tb+uKK67Q9u3brY4GAADamWGapml1CMTewIEDdc455+i5556LPta7d29de+21mjx5soXJAABAe2MG0IaCwaBKS0s1fPjwJo8PHz5cixYtsigVAACIFZfVARB7e/fuVTgcVl5eXpPH8/LyVF5efsTvCQQCCgQC0T9HIhHt379fHTp0kGEY7ZoXAND2TNNUdXW1CgoK5HAwH2Q3FEAbO7S4maZ51DI3efJk/eIXv4hFLABADO3YsUNdu3a1OgZijAJoQ7m5uXI6nYfN9lVUVBw2K3jQI488ogkTJkT/7Pf71a1bN21bcbKyMvjNEfFva6hGI0vuVY8/heTZXSk19/Rnw1Btr476ekyDPh44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0EE5OTl68MEH1bdvXw0bNkyS1Lt3b11++eX6f//v/+m///u/JUk/+MEPNGLEiBO6AhgA0DIZjhSdnyJJoUOe4a4fiC0KYJz59NNPdckll0T/PGHCBEnSbbfdpunTp+uhhx5SfX297r77blVWVmrgwIGaPXu2MjP/de/IZ555Ri6XS6NGjVJ9fb2GDh2q6dOny+n81wnIr7/+uu67777o1cIjR4486tqDAAAgubAOIFqEdQABILGxDqC98ckNAABgMxwCRoscnDiuqolYnAQA0BIHf35zINCeKIBokX379kmSup/zlbVBAACtUl1dLZ/PZ3UMxBgFEC2Sk5MjSdq+fTs/OI6iqqpKhYWF2rFjB+fXHAH759jYP8fG/jm2E9k/pmmqurpaBQUFMU6HeEABRIs4HN+cPurz+fjhexysm3hs7J9jY/8cG/vn2I63f/gF3r64CAQAAMBmKIAAAAA2QwFEi3i9Xv385z+X18tdy4+GfXRs7J9jY/8cG/vn2Ng/OB4WggYAALAZZgABAABshgIIAABgMxRAAAAAm6EAAgAA2AwFEC3yhz/8QUVFRUpJSVH//v01f/58qyO1u8mTJ+vcc89VZmamOnXqpGuvvVYbN25sMsY0TT322GMqKChQamqqLr74Yq1bt67JmEAgoPHjxys3N1fp6ekaOXKkdu7cGcu3EhOTJ0+WYRgqLi6OPsb+kXbt2qVbbrlFHTp0UFpams4++2yVlpZGn7fzPmpsbNRPfvITFRUVKTU1VT169NDjjz+uSORf9xy30/6ZN2+err76ahUUFMgwDL399ttNnm+rfVFZWamxY8fK5/PJ5/Np7NixOnDgQDu/O1jOBJppxowZptvtNl988UVz/fr15v3332+mp6eb27Ztszpau7rsssvMl19+2Vy7dq25atUq86qrrjK7detm1tTURMc8+eSTZmZmpvnXv/7VXLNmjTl69Gizc+fOZlVVVXTMXXfdZXbp0sUsKSkxV6xYYV5yySXmWWedZTY2NlrxttrFsmXLzJNPPtk888wzzfvvvz/6uN33z/79+83u3bubt99+u7l06VJz69at5ocffmh++eWX0TF23kdPPPGE2aFDB/Pvf/+7uXXrVvPPf/6zmZGRYf7mN7+JjrHT/pk1a5b56KOPmn/9619NSebMmTObPN9W++Lyyy83+/TpYy5atMhctGiR2adPH3PEiBGxepuwCAUQzXbeeeeZd911V5PHTjvtNPPhhx+2KJE1KioqTEnm3LlzTdM0zUgkYubn55tPPvlkdExDQ4Pp8/nM559/3jRN0zxw4IDpdrvNGTNmRMfs2rXLdDgc5vvvvx/bN9BOqqurzZ49e5olJSXmkCFDogWQ/WOaEydONAcPHnzU5+2+j6666irz+9//fpPHrr/+evOWW24xTdPe++fQAthW+2L9+vWmJHPJkiXRMYsXLzYlmZ9//nk7vytYiUPAaJZgMKjS0lINHz68yePDhw/XokWLLEplDb/fL0nKycmRJG3dulXl5eVN9o3X69WQIUOi+6a0tFShUKjJmIKCAvXp0ydp9t8999yjq666SsOGDWvyOPtHeueddzRgwADdeOON6tSpk/r166cXX3wx+rzd99HgwYP10UcfadOmTZKkzz77TAsWLNCVV14pif3z79pqXyxevFg+n08DBw6Mjjn//PPl8/mSan/hcC6rAyCx7N27V+FwWHl5eU0ez8vLU3l5uUWpYs80TU2YMEGDBw9Wnz59JCn6/o+0b7Zt2xYd4/F4lJ2dfdiYZNh/M2bM0IoVK7R8+fLDnmP/SFu2bNFzzz2nCRMm6D//8z+1bNky3XffffJ6vbr11lttv48mTpwov9+v0047TU6nU+FwWL/85S910003SeLf0L9rq31RXl6uTp06Hfb6nTp1Sqr9hcNRANEihmE0+bNpmoc9lszuvfderV69WgsWLDjsuZbsm2TYfzt27ND999+v2bNnKyUl5ajj7Lp/JCkSiWjAgAGaNGmSJKlfv35at26dnnvuOd16663RcXbdR2+++aZee+01vfHGGzrjjDO0atUqFRcXq6CgQLfddlt0nF33z5G0xb440vhk3V/4Fw4Bo1lyc3PldDoP+82woqLisN9Ek9X48eP1zjvvaM6cOeratWv08fz8fEk65r7Jz89XMBhUZWXlUcckqtLSUlVUVKh///5yuVxyuVyaO3eufve738nlckXfn133jyR17txZp59+epPHevfure3bt0vi39CPf/xjPfzww/re976nvn37auzYsfrRj36kyZMnS2L//Lu22hf5+fn6+uuvD3v9PXv2JNX+wuEogGgWj8ej/v37q6SkpMnjJSUlGjRokEWpYsM0Td17771666239PHHH6uoqKjJ80VFRcrPz2+yb4LBoObOnRvdN/3795fb7W4ypqysTGvXrk34/Td06FCtWbNGq1atin4NGDBAY8aM0apVq9SjRw9b7x9JuvDCCw9bOmjTpk3q3r27JP4N1dXVyeFo+rHkdDqjy8DYff/8u7baFxdccIH8fr+WLVsWHbN06VL5/f6k2l84AiuuPEFiO7gMzEsvvWSuX7/eLC4uNtPT082vvvrK6mjt6oc//KHp8/nMTz75xCwrK4t+1dXVRcc8+eSTps/nM9966y1zzZo15k033XTEZRm6du1qfvjhh+aKFSvM73znOwm5RMWJ+PergE2T/bNs2TLT5XKZv/zlL80vvvjCfP311820tDTztddei46x8z667bbbzC5dukSXgXnrrbfM3Nxc86GHHoqOsdP+qa6uNleuXGmuXLnSlGROnTrVXLlyZXTJrbbaF5dffrl55plnmosXLzYXL15s9u3bl2VgbIACiBb5/e9/b3bv3t30eDzmOeecE10KJZlJOuLXyy+/HB0TiUTMn//852Z+fr7p9XrNiy66yFyzZk2T16mvrzfvvfdeMycnx0xNTTVHjBhhbt++PcbvJjYOLYDsH9N89913zT59+pher9c87bTTzBdeeKHJ83beR1VVVeb9999vduvWzUxJSTF79OhhPvroo2YgEIiOsdP+mTNnzhF/5tx2222mabbdvti3b585ZswYMzMz08zMzDTHjBljVlZWxuhdwiqGaZqmNXOPAAAAsALnAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDP/H00W7zrCMUCtAAAAAElFTkSuQmCC", + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "im_shape=(1024,1024)\n", + "min_shapes = 5\n", + "im1 =random_shapes(im_shape, 20, min_shapes=min_shapes)[0]\n", + "im1 = relabel_sequential(im1.sum(axis=-1))[0]\n", + "im2 =random_shapes(im_shape, 20, min_shapes=min_shapes)[0]\n", + "im2 = relabel_sequential(im2.sum(axis=-1))[0]\n", + "\n", + "plt.figure()\n", + "plt.imshow(im1)" ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" }, { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "042721c850864044a44ce53c336abbc0", - "version_major": 2, - "version_minor": 0 + "cell_type": "code", + "execution_count": 5, + "id": "c04d5306-3da7-42c5-bb0e-9683643ec78d", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:12:47.468831Z", + "iopub.status.busy": "2021-10-14T04:12:47.468355Z", + "iopub.status.idle": "2021-10-14T04:12:47.605352Z", + "shell.execute_reply": "2021-10-14T04:12:47.604826Z", + "shell.execute_reply.started": "2021-10-14T04:12:47.468775Z" + }, + "tags": [] }, - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMR0lEQVR4nO3deXxU9aH+8efMmn1MCCQEAgaFioKKoChS0YK4IW4Vqoh6i79qVTRFK3rtYr0WxFZsK61evV7xuhS7iNUWlajIvhlAVkEBWRPDEib7zGTm/P6wTBv2bHNm5nzer1f+YOabOc8cIPPke875HsM0TVMAAACwDYfVAQAAABBbFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiANvaHP/xBRUVFSklJUf/+/TV//nyrIwEAgBigANrUm2++qeLiYj366KNauXKlvv3tb+uKK67Q9u3brY4GAADamWGapml1CMTewIEDdc455+i5556LPta7d29de+21mjx5soXJAABAe2MG0IaCwaBKS0s1fPjwJo8PHz5cixYtsigVAACIFZfVARB7e/fuVTgcVl5eXpPH8/LyVF5efsTvCQQCCgQC0T9HIhHt379fHTp0kGEY7ZoXAND2TNNUdXW1CgoK5HAwH2Q3FEAbO7S4maZ51DI3efJk/eIXv4hFLABADO3YsUNdu3a1OgZijAJoQ7m5uXI6nYfN9lVUVBw2K3jQI488ogkTJkT/7Pf71a1bN21bcbKyMvjNEfFva6hGI0vuVY8/heTZXSk19/Rnw1Btr476ekyDPh44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0EE5OTl68MEH1bdvXw0bNkyS1Lt3b11++eX6f//v/+m///u/JUk/+MEPNGLEiBO6AhgA0DIZjhSdnyJJoUOe4a4fiC0KYJz59NNPdckll0T/PGHCBEnSbbfdpunTp+uhhx5SfX297r77blVWVmrgwIGaPXu2MjP/de/IZ555Ri6XS6NGjVJ9fb2GDh2q6dOny+n81wnIr7/+uu67777o1cIjR4486tqDAAAgubAOIFqEdQABILGxDqC98ckNAABgMxwCRoscnDiuqolYnAQA0BIHf35zINCeKIBokX379kmSup/zlbVBAACtUl1dLZ/PZ3UMxBgFEC2Sk5MjSdq+fTs/OI6iqqpKhYWF2rFjB+fXHAH759jYP8fG/jm2E9k/pmmqurpaBQUFMU6HeEABRIs4HN+cPurz+fjhexysm3hs7J9jY/8cG/vn2I63f/gF3r64CAQAAMBmKIAAAAA2QwFEi3i9Xv385z+X18tdy4+GfXRs7J9jY/8cG/vn2Ng/OB4WggYAALAZZgABAABshgIIAABgMxRAAAAAm6EAAgAA2AwFEC3yhz/8QUVFRUpJSVH//v01f/58qyO1u8mTJ+vcc89VZmamOnXqpGuvvVYbN25sMsY0TT322GMqKChQamqqLr74Yq1bt67JmEAgoPHjxys3N1fp6ekaOXKkdu7cGcu3EhOTJ0+WYRgqLi6OPsb+kXbt2qVbbrlFHTp0UFpams4++2yVlpZGn7fzPmpsbNRPfvITFRUVKTU1VT169NDjjz+uSORf9xy30/6ZN2+err76ahUUFMgwDL399ttNnm+rfVFZWamxY8fK5/PJ5/Np7NixOnDgQDu/O1jOBJppxowZptvtNl988UVz/fr15v3332+mp6eb27Ztszpau7rsssvMl19+2Vy7dq25atUq86qrrjK7detm1tTURMc8+eSTZmZmpvnXv/7VXLNmjTl69Gizc+fOZlVVVXTMXXfdZXbp0sUsKSkxV6xYYV5yySXmWWedZTY2NlrxttrFsmXLzJNPPtk888wzzfvvvz/6uN33z/79+83u3bubt99+u7l06VJz69at5ocffmh++eWX0TF23kdPPPGE2aFDB/Pvf/+7uXXrVvPPf/6zmZGRYf7mN7+JjrHT/pk1a5b56KOPmn/9619NSebMmTObPN9W++Lyyy83+/TpYy5atMhctGiR2adPH3PEiBGxepuwCAUQzXbeeeeZd911V5PHTjvtNPPhhx+2KJE1KioqTEnm3LlzTdM0zUgkYubn55tPPvlkdExDQ4Pp8/nM559/3jRN0zxw4IDpdrvNGTNmRMfs2rXLdDgc5vvvvx/bN9BOqqurzZ49e5olJSXmkCFDogWQ/WOaEydONAcPHnzU5+2+j6666irz+9//fpPHrr/+evOWW24xTdPe++fQAthW+2L9+vWmJHPJkiXRMYsXLzYlmZ9//nk7vytYiUPAaJZgMKjS0lINHz68yePDhw/XokWLLEplDb/fL0nKycmRJG3dulXl5eVN9o3X69WQIUOi+6a0tFShUKjJmIKCAvXp0ydp9t8999yjq666SsOGDWvyOPtHeueddzRgwADdeOON6tSpk/r166cXX3wx+rzd99HgwYP10UcfadOmTZKkzz77TAsWLNCVV14pif3z79pqXyxevFg+n08DBw6Mjjn//PPl8/mSan/hcC6rAyCx7N27V+FwWHl5eU0ez8vLU3l5uUWpYs80TU2YMEGDBw9Wnz59JCn6/o+0b7Zt2xYd4/F4lJ2dfdiYZNh/M2bM0IoVK7R8+fLDnmP/SFu2bNFzzz2nCRMm6D//8z+1bNky3XffffJ6vbr11lttv48mTpwov9+v0047TU6nU+FwWL/85S910003SeLf0L9rq31RXl6uTp06Hfb6nTp1Sqr9hcNRANEihmE0+bNpmoc9lszuvfderV69WgsWLDjsuZbsm2TYfzt27ND999+v2bNnKyUl5ajj7Lp/JCkSiWjAgAGaNGmSJKlfv35at26dnnvuOd16663RcXbdR2+++aZee+01vfHGGzrjjDO0atUqFRcXq6CgQLfddlt0nF33z5G0xb440vhk3V/4Fw4Bo1lyc3PldDoP+82woqLisN9Ek9X48eP1zjvvaM6cOeratWv08fz8fEk65r7Jz89XMBhUZWXlUcckqtLSUlVUVKh///5yuVxyuVyaO3eufve738nlckXfn133jyR17txZp59+epPHevfure3bt0vi39CPf/xjPfzww/re976nvn37auzYsfrRj36kyZMnS2L//Lu22hf5+fn6+uuvD3v9PXv2JNX+wuEogGgWj8ej/v37q6SkpMnjJSUlGjRokEWpYsM0Td17771666239PHHH6uoqKjJ80VFRcrPz2+yb4LBoObOnRvdN/3795fb7W4ypqysTGvXrk34/Td06FCtWbNGq1atin4NGDBAY8aM0apVq9SjRw9b7x9JuvDCCw9bOmjTpk3q3r27JP4N1dXVyeFo+rHkdDqjy8DYff/8u7baFxdccIH8fr+WLVsWHbN06VL5/f6k2l84AiuuPEFiO7gMzEsvvWSuX7/eLC4uNtPT082vvvrK6mjt6oc//KHp8/nMTz75xCwrK4t+1dXVRcc8+eSTps/nM9966y1zzZo15k033XTEZRm6du1qfvjhh+aKFSvM73znOwm5RMWJ+PergE2T/bNs2TLT5XKZv/zlL80vvvjCfP311820tDTztddei46x8z667bbbzC5dukSXgXnrrbfM3Nxc86GHHoqOsdP+qa6uNleuXGmuXLnSlGROnTrVXLlyZXTJrbbaF5dffrl55plnmosXLzYXL15s9u3bl2VgbIACiBb5/e9/b3bv3t30eDzmOeecE10KJZlJOuLXyy+/HB0TiUTMn//852Z+fr7p9XrNiy66yFyzZk2T16mvrzfvvfdeMycnx0xNTTVHjBhhbt++PcbvJjYOLYDsH9N89913zT59+pher9c87bTTzBdeeKHJ83beR1VVVeb9999vduvWzUxJSTF79OhhPvroo2YgEIiOsdP+mTNnzhF/5tx2222mabbdvti3b585ZswYMzMz08zMzDTHjBljVlZWxuhdwiqGaZqmNXOPAAAAsALnAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDMUQAAAAJuhAAIAANgMBRAAAMBmKIAAAAA2QwEEAACwGQogAACAzVAAAQAAbIYCCAAAYDP/H00W7zrCMUCtAAAAAElFTkSuQmCC", - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + "outputs": [], + "source": [ + "import numpy as np\n", + "import numba\n", + "from numba import jit\n" ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "im_shape=(1024,1024)\n", - "min_shapes = 5\n", - "im1 =random_shapes(im_shape, 20, min_shapes=min_shapes)[0]\n", - "im1 = relabel_sequential(im1.sum(axis=-1))[0]\n", - "im2 =random_shapes(im_shape, 20, min_shapes=min_shapes)[0]\n", - "im2 = relabel_sequential(im2.sum(axis=-1))[0]\n", - "\n", - "plt.figure()\n", - "plt.imshow(im1)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c04d5306-3da7-42c5-bb0e-9683643ec78d", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:12:47.468831Z", - "iopub.status.busy": "2021-10-14T04:12:47.468355Z", - "iopub.status.idle": "2021-10-14T04:12:47.605352Z", - "shell.execute_reply": "2021-10-14T04:12:47.604826Z", - "shell.execute_reply.started": "2021-10-14T04:12:47.468775Z" }, - "tags": [] - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import numba\n", - "from numba import jit\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "4b431b5a-6500-4ab6-90f1-bb0f6fc2f111", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:12:47.794835Z", - "iopub.status.busy": "2021-10-14T04:12:47.794488Z", - "iopub.status.idle": "2021-10-14T04:12:47.830379Z", - "shell.execute_reply": "2021-10-14T04:12:47.829641Z", - "shell.execute_reply.started": "2021-10-14T04:12:47.794811Z" + { + "cell_type": "code", + "execution_count": 6, + "id": "4b431b5a-6500-4ab6-90f1-bb0f6fc2f111", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:12:47.794835Z", + "iopub.status.busy": "2021-10-14T04:12:47.794488Z", + "iopub.status.idle": "2021-10-14T04:12:47.830379Z", + "shell.execute_reply": "2021-10-14T04:12:47.829641Z", + "shell.execute_reply.started": "2021-10-14T04:12:47.794811Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "SQRT_2PI = np.sqrt(2 * np.pi)\n", + "\n", + "@jit(nopython=True, parallel=True)\n", + "def gaussians(x, means, widths):\n", + " '''Return the value of gaussian kernels.\n", + " \n", + " x - location of evaluation\n", + " means - array of kernel means\n", + " widths - array of kernel widths\n", + " '''\n", + " n = means.shape[0]\n", + " result = np.exp( -0.5 * ((x - means) / widths)**2 ) / widths\n", + " return result / SQRT_2PI / n" + ] }, - "tags": [] - }, - "outputs": [], - "source": [ - "SQRT_2PI = np.sqrt(2 * np.pi)\n", - "\n", - "@jit(nopython=True, parallel=True)\n", - "def gaussians(x, means, widths):\n", - " '''Return the value of gaussian kernels.\n", - " \n", - " x - location of evaluation\n", - " means - array of kernel means\n", - " widths - array of kernel widths\n", - " '''\n", - " n = means.shape[0]\n", - " result = np.exp( -0.5 * ((x - means) / widths)**2 ) / widths\n", - " return result / SQRT_2PI / n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "05a8762f-e291-4de1-9dbc-e643a9f950f2", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:12:48.331260Z", - "iopub.status.busy": "2021-10-14T04:12:48.329971Z", - "iopub.status.idle": "2021-10-14T04:12:49.013534Z", - "shell.execute_reply": "2021-10-14T04:12:49.013095Z", - "shell.execute_reply.started": "2021-10-14T04:12:48.331201Z" + { + "cell_type": "code", + "execution_count": 7, + "id": "05a8762f-e291-4de1-9dbc-e643a9f950f2", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:12:48.331260Z", + "iopub.status.busy": "2021-10-14T04:12:48.329971Z", + "iopub.status.idle": "2021-10-14T04:12:49.013534Z", + "shell.execute_reply": "2021-10-14T04:12:49.013095Z", + "shell.execute_reply.started": "2021-10-14T04:12:48.331201Z" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.67404304e-06, 8.55069057e-32, 1.21639285e-06, ...,\n", + " 2.04607590e-07, 4.89871622e-07, 1.39271340e-06])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "means = np.random.uniform(-1, 1, size=1000000)\n", + "widths = np.random.uniform(0.1, 0.3, size=1000000)\n", + "\n", + "gaussians(0.4, means, widths)" + ] }, - "tags": [] - }, - "outputs": [ { - "data": { - "text/plain": [ - "array([1.67404304e-06, 8.55069057e-32, 1.21639285e-06, ...,\n", - " 2.04607590e-07, 4.89871622e-07, 1.39271340e-06])" + "cell_type": "code", + "execution_count": 8, + "id": "06b41ca1-7600-4348-8c95-f2a3710edc4d", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:12:49.014854Z", + "iopub.status.busy": "2021-10-14T04:12:49.014531Z", + "iopub.status.idle": "2021-10-14T04:12:51.804373Z", + "shell.execute_reply": "2021-10-14T04:12:51.803633Z", + "shell.execute_reply.started": "2021-10-14T04:12:49.014828Z" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9.15 ms ± 617 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", + "3.01 ms ± 299 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "gaussians_nothread = jit(nopython=True)(gaussians.py_func)\n", + "\n", + "%timeit gaussians_nothread(0.4, means, widths)\n", + "%timeit gaussians(0.4, means, widths)" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "means = np.random.uniform(-1, 1, size=1000000)\n", - "widths = np.random.uniform(0.1, 0.3, size=1000000)\n", - "\n", - "gaussians(0.4, means, widths)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "06b41ca1-7600-4348-8c95-f2a3710edc4d", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:12:49.014854Z", - "iopub.status.busy": "2021-10-14T04:12:49.014531Z", - "iopub.status.idle": "2021-10-14T04:12:51.804373Z", - "shell.execute_reply": "2021-10-14T04:12:51.803633Z", - "shell.execute_reply.started": "2021-10-14T04:12:49.014828Z" }, - "tags": [] - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.15 ms ± 617 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", - "3.01 ms ± 299 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "gaussians_nothread = jit(nopython=True)(gaussians.py_func)\n", - "\n", - "%timeit gaussians_nothread(0.4, means, widths)\n", - "%timeit gaussians(0.4, means, widths)" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "7edb18c3-1357-4fe5-b8fb-1f14be18a2f1", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:38:05.202363Z", - "iopub.status.busy": "2021-10-14T04:38:05.201831Z", - "iopub.status.idle": "2021-10-14T04:38:05.374641Z", - "shell.execute_reply": "2021-10-14T04:38:05.373914Z", - "shell.execute_reply.started": "2021-10-14T04:38:05.202329Z" + "cell_type": "code", + "execution_count": 62, + "id": "7edb18c3-1357-4fe5-b8fb-1f14be18a2f1", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:38:05.202363Z", + "iopub.status.busy": "2021-10-14T04:38:05.201831Z", + "iopub.status.idle": "2021-10-14T04:38:05.374641Z", + "shell.execute_reply": "2021-10-14T04:38:05.373914Z", + "shell.execute_reply.started": "2021-10-14T04:38:05.202329Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from numba import int32\n", + "\n", + "@jit((int32[:,:], int32[:,:], int32, int32), nopython=True)\n", + "def overlap_numba(prev, curr, shape1, shape2):\n", + " arr = np.zeros((shape1, shape2), dtype=np.dtype(\"i\"))\n", + " for i in range(prev.shape[0]):\n", + " for j in range(prev.shape[1]):\n", + " arr[prev[i,j],curr[i,j]] += 1\n", + " return arr\n", + "\n" + ] }, - "tags": [] - }, - "outputs": [], - "source": [ - "from numba import int32\n", - "\n", - "@jit((int32[:,:], int32[:,:], int32, int32), nopython=True)\n", - "def overlap_numba(prev, curr, shape1, shape2):\n", - " arr = np.zeros((shape1, shape2), dtype=np.dtype(\"i\"))\n", - " for i in range(prev.shape[0]):\n", - " for j in range(prev.shape[1]):\n", - " arr[prev[i,j],curr[i,j]] += 1\n", - " return arr\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "8a306720-93c3-41b3-b074-8c7d2776cc01", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:37:16.698670Z", - "iopub.status.busy": "2021-10-14T04:37:16.698015Z", - "iopub.status.idle": "2021-10-14T04:37:16.701977Z", - "shell.execute_reply": "2021-10-14T04:37:16.701343Z", - "shell.execute_reply.started": "2021-10-14T04:37:16.698630Z" - } - }, - "outputs": [], - "source": [ - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "ad71ac55-c121-4c23-85ae-444f2e8f3f85", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:37:48.602818Z", - "iopub.status.busy": "2021-10-14T04:37:48.602482Z", - "iopub.status.idle": "2021-10-14T04:37:48.608563Z", - "shell.execute_reply": "2021-10-14T04:37:48.607897Z", - "shell.execute_reply.started": "2021-10-14T04:37:48.602778Z" + { + "cell_type": "code", + "execution_count": 56, + "id": "8a306720-93c3-41b3-b074-8c7d2776cc01", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:37:16.698670Z", + "iopub.status.busy": "2021-10-14T04:37:16.698015Z", + "iopub.status.idle": "2021-10-14T04:37:16.701977Z", + "shell.execute_reply": "2021-10-14T04:37:16.701343Z", + "shell.execute_reply.started": "2021-10-14T04:37:16.698630Z" + } + }, + "outputs": [], + "source": [ + "import os" + ] }, - "tags": [] - }, - "outputs": [], - "source": [ - "os.environ['NUMBA_CACHE_DIR'] = \"/tmp\"" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "a8c01eda-eed1-4846-b179-6360656aafb3", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:33:02.790512Z", - "iopub.status.busy": "2021-10-14T04:33:02.789900Z", - "iopub.status.idle": "2021-10-14T04:33:02.794652Z", - "shell.execute_reply": "2021-10-14T04:33:02.793523Z", - "shell.execute_reply.started": "2021-10-14T04:33:02.790467Z" + { + "cell_type": "code", + "execution_count": 60, + "id": "ad71ac55-c121-4c23-85ae-444f2e8f3f85", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:37:48.602818Z", + "iopub.status.busy": "2021-10-14T04:37:48.602482Z", + "iopub.status.idle": "2021-10-14T04:37:48.608563Z", + "shell.execute_reply": "2021-10-14T04:37:48.607897Z", + "shell.execute_reply.started": "2021-10-14T04:37:48.602778Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "os.environ['NUMBA_CACHE_DIR'] = \"/tmp\"" + ] }, - "tags": [] - }, - "outputs": [], - "source": [ - "# @jit(nopython=True, parallel=True)\n", - "# def overlap_numba_parallel(prev, curr, shape):\n", - "# arr = np.zeros(shape, dtype=np.dtype(\"i\"))\n", - "# for i in numba.prange(prev.shape[0]):\n", - "# for j in range(prev.shape[1]):\n", - "# arr[prev[i,j],curr[i,j]] += 1\n", - "# return arr" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "6209372c-de03-4092-8a1d-a0861a9f2332", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:33:02.973104Z", - "iopub.status.busy": "2021-10-14T04:33:02.972887Z", - "iopub.status.idle": "2021-10-14T04:33:02.980532Z", - "shell.execute_reply": "2021-10-14T04:33:02.979895Z", - "shell.execute_reply.started": "2021-10-14T04:33:02.973080Z" + { + "cell_type": "code", + "execution_count": 50, + "id": "a8c01eda-eed1-4846-b179-6360656aafb3", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:33:02.790512Z", + "iopub.status.busy": "2021-10-14T04:33:02.789900Z", + "iopub.status.idle": "2021-10-14T04:33:02.794652Z", + "shell.execute_reply": "2021-10-14T04:33:02.793523Z", + "shell.execute_reply.started": "2021-10-14T04:33:02.790467Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# @jit(nopython=True, parallel=True)\n", + "# def overlap_numba_parallel(prev, curr, shape):\n", + "# arr = np.zeros(shape, dtype=np.dtype(\"i\"))\n", + "# for i in numba.prange(prev.shape[0]):\n", + "# for j in range(prev.shape[1]):\n", + "# arr[prev[i,j],curr[i,j]] += 1\n", + "# return arr" + ] }, - "tags": [] - }, - "outputs": [ { - "data": { - "text/plain": [ - "(13, 9)" + "cell_type": "code", + "execution_count": 51, + "id": "6209372c-de03-4092-8a1d-a0861a9f2332", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:33:02.973104Z", + "iopub.status.busy": "2021-10-14T04:33:02.972887Z", + "iopub.status.idle": "2021-10-14T04:33:02.980532Z", + "shell.execute_reply": "2021-10-14T04:33:02.979895Z", + "shell.execute_reply.started": "2021-10-14T04:33:02.973080Z" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(13, 9)" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "shape = (int(np.max(im1)+1), int(np.max(im2)+1))\n", + "shape\n" ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "shape = (int(np.max(im1)+1), int(np.max(im2)+1))\n", - "shape\n" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "passing-macedonia", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:33:03.197412Z", - "iopub.status.busy": "2021-10-14T04:33:03.196985Z", - "iopub.status.idle": "2021-10-14T04:33:03.203985Z", - "shell.execute_reply": "2021-10-14T04:33:03.202860Z", - "shell.execute_reply.started": "2021-10-14T04:33:03.197360Z" }, - "tags": [] - }, - "outputs": [], - "source": [ - "import fast_overlap" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "6dc863ed-260a-4567-a6e5-19d0f5072c39", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:38:08.088219Z", - "iopub.status.busy": "2021-10-14T04:38:08.087956Z", - "iopub.status.idle": "2021-10-14T04:38:10.114854Z", - "shell.execute_reply": "2021-10-14T04:38:10.114358Z", - "shell.execute_reply.started": "2021-10-14T04:38:08.088188Z" + { + "cell_type": "code", + "execution_count": 52, + "id": "passing-macedonia", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:33:03.197412Z", + "iopub.status.busy": "2021-10-14T04:33:03.196985Z", + "iopub.status.idle": "2021-10-14T04:33:03.203985Z", + "shell.execute_reply": "2021-10-14T04:33:03.202860Z", + "shell.execute_reply.started": "2021-10-14T04:33:03.197360Z" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import fast_overlap" + ] }, - "tags": [] - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.99 s, sys: 733 µs, total: 1.99 s\n", - "Wall time: 2 s\n", - "CPU times: user 3.54 ms, sys: 0 ns, total: 3.54 ms\n", - "Wall time: 3.3 ms\n", - "CPU times: user 3.29 ms, sys: 0 ns, total: 3.29 ms\n", - "Wall time: 3.12 ms\n", - "CPU times: user 90.1 ms, sys: 0 ns, total: 90.1 ms\n", - "Wall time: 14.8 ms\n" - ] - } - ], - "source": [ - "%time out = overlap_numba.py_func(im1.astype(np.int32), im2.astype(np.int32), *shape)\n", - "%time out = overlap_numba(im1.astype(np.int32), im2.astype(np.int32), *shape)\n", - "# %time out = overlap_numba_parallel(im1.astype(np.int32), im2.astype(np.int32), shape)\n", - "%time out = np.array(fast_overlap.overlap(im1.astype(np.int32), im2.astype(np.int32), shape))\n", - "%time out = np.array(fast_overlap.overlap_prange(im1.astype(np.int32), im2.astype(np.int32), shape))" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "899e2da7-52a4-4a50-b5e9-0ac65792ad9f", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T05:36:04.053213Z", - "iopub.status.busy": "2021-10-14T05:36:04.052213Z", - "iopub.status.idle": "2021-10-14T05:36:04.135735Z", - "shell.execute_reply": "2021-10-14T05:36:04.133831Z", - "shell.execute_reply.started": "2021-10-14T05:36:04.053094Z" - } - }, - "outputs": [], - "source": [ - "out = np.array(fast_overlap.overlap(im1.astype(np.int32), im2.astype(np.int32), shape))\n", - "out_p = np.array(fast_overlap.overlap_prange(im1.astype(np.int32), im2.astype(np.int32), shape))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "deadly-railway", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T05:36:13.789540Z", - "iopub.status.busy": "2021-10-14T05:36:13.788007Z", - "iopub.status.idle": "2021-10-14T05:36:13.802328Z", - "shell.execute_reply": "2021-10-14T05:36:13.800147Z", - "shell.execute_reply.started": "2021-10-14T05:36:13.789448Z" + "cell_type": "code", + "execution_count": 63, + "id": "6dc863ed-260a-4567-a6e5-19d0f5072c39", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:38:08.088219Z", + "iopub.status.busy": "2021-10-14T04:38:08.087956Z", + "iopub.status.idle": "2021-10-14T04:38:10.114854Z", + "shell.execute_reply": "2021-10-14T04:38:10.114358Z", + "shell.execute_reply.started": "2021-10-14T04:38:08.088188Z" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.99 s, sys: 733 µs, total: 1.99 s\n", + "Wall time: 2 s\n", + "CPU times: user 3.54 ms, sys: 0 ns, total: 3.54 ms\n", + "Wall time: 3.3 ms\n", + "CPU times: user 3.29 ms, sys: 0 ns, total: 3.29 ms\n", + "Wall time: 3.12 ms\n", + "CPU times: user 90.1 ms, sys: 0 ns, total: 90.1 ms\n", + "Wall time: 14.8 ms\n" + ] + } + ], + "source": [ + "%time out = overlap_numba.py_func(im1.astype(np.int32), im2.astype(np.int32), *shape)\n", + "%time out = overlap_numba(im1.astype(np.int32), im2.astype(np.int32), *shape)\n", + "# %time out = overlap_numba_parallel(im1.astype(np.int32), im2.astype(np.int32), shape)\n", + "%time out = np.array(fast_overlap.overlap(im1.astype(np.int32), im2.astype(np.int32), shape))\n", + "%time out = np.array(fast_overlap.overlap_prange(im1.astype(np.int32), im2.astype(np.int32), shape))" + ] }, - "tags": [] - }, - "outputs": [ { - "data": { - "text/plain": [ - "array([[ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, False, True, False],\n", - " [ True, True, True, True, True, True, True, True, False],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, False, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, True, True, True],\n", - " [ True, True, True, True, True, True, False, False, False]])" + "cell_type": "code", + "execution_count": 64, + "id": "899e2da7-52a4-4a50-b5e9-0ac65792ad9f", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T05:36:04.053213Z", + "iopub.status.busy": "2021-10-14T05:36:04.052213Z", + "iopub.status.idle": "2021-10-14T05:36:04.135735Z", + "shell.execute_reply": "2021-10-14T05:36:04.133831Z", + "shell.execute_reply.started": "2021-10-14T05:36:04.053094Z" + } + }, + "outputs": [], + "source": [ + "out = np.array(fast_overlap.overlap(im1.astype(np.int32), im2.astype(np.int32), shape))\n", + "out_p = np.array(fast_overlap.overlap_prange(im1.astype(np.int32), im2.astype(np.int32), shape))\n" ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "out == out_p" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "341094c6-0445-485b-8fb1-761d9f9dddfb", - "metadata": { - "execution": { - "iopub.execute_input": "2021-10-14T04:06:23.993283Z", - "iopub.status.busy": "2021-10-14T04:06:23.993063Z", - "iopub.status.idle": "2021-10-14T04:06:25.026373Z", - "shell.execute_reply": "2021-10-14T04:06:25.025698Z", - "shell.execute_reply.started": "2021-10-14T04:06:23.993259Z" }, - "tags": [] - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.15 s, sys: 741 ms, total: 1.89 s\n", - "Wall time: 1.03 s\n" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "analyzed-investigator", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 66, + "id": "deadly-railway", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T05:36:13.789540Z", + "iopub.status.busy": "2021-10-14T05:36:13.788007Z", + "iopub.status.idle": "2021-10-14T05:36:13.802328Z", + "shell.execute_reply": "2021-10-14T05:36:13.800147Z", + "shell.execute_reply.started": "2021-10-14T05:36:13.789448Z" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, False, True, False],\n", + " [ True, True, True, True, True, True, True, True, False],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, False, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, False, False, False]])" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "out == out_p" + ] + }, { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9ad044d7b0444e1caa74e160833bf81e", - "version_major": 2, - "version_minor": 0 + "cell_type": "code", + "execution_count": 12, + "id": "341094c6-0445-485b-8fb1-761d9f9dddfb", + "metadata": { + "execution": { + "iopub.execute_input": "2021-10-14T04:06:23.993283Z", + "iopub.status.busy": "2021-10-14T04:06:23.993063Z", + "iopub.status.idle": "2021-10-14T04:06:25.026373Z", + "shell.execute_reply": "2021-10-14T04:06:25.025698Z", + "shell.execute_reply.started": "2021-10-14T04:06:23.993259Z" + }, + "tags": [] }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.15 s, sys: 741 ms, total: 1.89 s\n", + "Wall time: 1.03 s\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "analyzed-investigator", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ad044d7b0444e1caa74e160833bf81e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(overlap)" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "data": { - "text/plain": [ - "" + "cell_type": "code", + "execution_count": 36, + "id": "humanitarian-general", + "metadata": {}, + "outputs": [], + "source": [ + "idx = im1.flatten() == im2.flatten()" ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "plt.figure()\n", - "plt.imshow(overlap)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "humanitarian-general", - "metadata": {}, - "outputs": [], - "source": [ - "idx = im1.flatten() == im2.flatten()" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "interior-registration", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "(array([11, 13], dtype=uint64), array([79, 89]))" + "cell_type": "code", + "execution_count": 38, + "id": "interior-registration", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([11, 13], dtype=uint64), array([79, 89]))" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.unique(im1.flatten()[idx], return_counts=True)" ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.unique(im1.flatten()[idx], return_counts=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "phantom-trinidad", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "phantom-trinidad", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=uint64),\n", + " array([43553, 55777, 94, 31198, 7592, 63166, 53341, 59662, 61027,\n", + " 63271, 26492, 33450, 43743]),\n", + " array([ 1399, 60944, 17379, 23383, 2604, 21219, 48098, 51155, 37453,\n", + " 14717, 18823, 18729, 0]))" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.intersect1d(im1, im2, return_indices=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "twelve-delta", + "metadata": {}, + "outputs": [], + "source": [ + "idx = im1 == im2" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "effective-survey", + "metadata": {}, + "outputs": [], + "source": [ + "flat1 = im1.flatten()\n", + "flat2 = im2.flatten()\n", + "\n", + "idx = flat1 == flat2" + ] + }, { - "data": { - "text/plain": [ - "(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=uint64),\n", - " array([43553, 55777, 94, 31198, 7592, 63166, 53341, 59662, 61027,\n", - " 63271, 26492, 33450, 43743]),\n", - " array([ 1399, 60944, 17379, 23383, 2604, 21219, 48098, 51155, 37453,\n", - " 14717, 18823, 18729, 0]))" + "cell_type": "code", + "execution_count": 45, + "id": "polar-allocation", + "metadata": {}, + "outputs": [], + "source": [ + "out = np.zeros((19, 14))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "alive-plenty", + "metadata": {}, + "outputs": [], + "source": [ + "out.ravel()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "organized-louisiana", + "metadata": {}, + "outputs": [], + "source": [ + "np.ravel()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "extensive-examination", + "metadata": {}, + "outputs": [], + "source": [ + "# identify the unique values:\n", + "uniques = np.unique(data)\n", + "\n", + "# dummy for each row\n", + "a = (data[...,None] == uniques).sum(1)\n", + "\n", + "# output\n", + "out = np.einsum('ij,kj->ik',a,a)" ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "np.intersect1d(im1, im2, return_indices=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "twelve-delta", - "metadata": {}, - "outputs": [], - "source": [ - "idx = im1 == im2" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "effective-survey", - "metadata": {}, - "outputs": [], - "source": [ - "flat1 = im1.flatten()\n", - "flat2 = im2.flatten()\n", - "\n", - "idx = flat1 == flat2" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "polar-allocation", - "metadata": {}, - "outputs": [], - "source": [ - "out = np.zeros((19, 14))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "alive-plenty", - "metadata": {}, - "outputs": [], - "source": [ - "out.ravel()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "organized-louisiana", - "metadata": {}, - "outputs": [], - "source": [ - "np.ravel()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "extensive-examination", - "metadata": {}, - "outputs": [], - "source": [ - "# identify the unique values:\n", - "uniques = np.unique(data)\n", - "\n", - "# dummy for each row\n", - "a = (data[...,None] == uniques).sum(1)\n", - "\n", - "# output\n", - "out = np.einsum('ij,kj->ik',a,a)" - ] - } - ], - "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.9.7" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": { - "042721c850864044a44ce53c336abbc0": { - "model_module": "jupyter-matplotlib", - "model_module_version": "^0.10.0", - "model_name": "MPLCanvasModel", - "state": { - "_figure_label": "Figure 1", - "_height": 480, - "_width": 640, - "layout": "IPY_MODEL_aad681f041754fcca57b7a277a373030", - "toolbar": "IPY_MODEL_e48fb62e70c14549a073dfc55e85357e", - "toolbar_position": "left" - } - }, - "aad681f041754fcca57b7a277a373030": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": {} - }, - "af050387317a4d91ba05e9eb3d991f31": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": {} - }, - "e48fb62e70c14549a073dfc55e85357e": { - "model_module": "jupyter-matplotlib", - "model_module_version": "^0.10.0", - "model_name": "ToolbarModel", - "state": { - "layout": "IPY_MODEL_af050387317a4d91ba05e9eb3d991f31", - "toolitems": [ - [ - "Home", - "Reset original view", - "home", - "home" - ], - [ - "Back", - "Back to previous view", - "arrow-left", - "back" - ], - [ - "Forward", - "Forward to next view", - "arrow-right", - "forward" - ], - [ - "Pan", - "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", - "arrows", - "pan" - ], - [ - "Zoom", - "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", - "square-o", - "zoom" - ], - [ - "Download", - "Download plot", - "floppy-o", - "save_figure" - ] - ] - } - } + ], + "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.9.7" }, - "version_major": 2, - "version_minor": 0 - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "042721c850864044a44ce53c336abbc0": { + "model_module": "jupyter-matplotlib", + "model_module_version": "^0.10.0", + "model_name": "MPLCanvasModel", + "state": { + "_figure_label": "Figure 1", + "_height": 480, + "_width": 640, + "layout": "IPY_MODEL_aad681f041754fcca57b7a277a373030", + "toolbar": "IPY_MODEL_e48fb62e70c14549a073dfc55e85357e", + "toolbar_position": "left" + } + }, + "aad681f041754fcca57b7a277a373030": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "af050387317a4d91ba05e9eb3d991f31": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "e48fb62e70c14549a073dfc55e85357e": { + "model_module": "jupyter-matplotlib", + "model_module_version": "^0.10.0", + "model_name": "ToolbarModel", + "state": { + "layout": "IPY_MODEL_af050387317a4d91ba05e9eb3d991f31", + "toolitems": [ + [ + "Home", + "Reset original view", + "home", + "home" + ], + [ + "Back", + "Back to previous view", + "arrow-left", + "back" + ], + [ + "Forward", + "Forward to next view", + "arrow-right", + "forward" + ], + [ + "Pan", + "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", + "arrows", + "pan" + ], + [ + "Zoom", + "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", + "square-o", + "zoom" + ], + [ + "Download", + "Download plot", + "floppy-o", + "save_figure" + ] + ] + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/setup.cfg b/setup.cfg index 29bf6a9..59d757c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,7 +11,7 @@ platforms = Linux, Mac OS X, Windows [options] packages = find: install_requires = - numpy >= 1.20.0 + numpy>=1.20.0 python_requires = >=3.7,<3.11 [options.extras_require]