Skip to content

Instantly share code, notes, and snippets.

@lagru
Created July 15, 2018 12:00
Show Gist options
  • Save lagru/142a9613e2233cbde47dc783c071e717 to your computer and use it in GitHub Desktop.
Save lagru/142a9613e2233cbde47dc783c071e717 to your computer and use it in GitHub Desktop.
select_by_distance.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Demo: Filter local maxima by distance"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%load_ext Cython\n",
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<!DOCTYPE html>\n",
"<!-- Generated by Cython 0.28.3 -->\n",
"<html>\n",
"<head>\n",
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
" <title>Cython: _cython_magic_0299cda6b7dca58eb058d0fde159267e.pyx</title>\n",
" <style type=\"text/css\">\n",
" \n",
"body.cython { font-family: courier; font-size: 12; }\n",
"\n",
".cython.tag { }\n",
".cython.line { margin: 0em }\n",
".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n",
"\n",
".cython.line .run { background-color: #B0FFB0; }\n",
".cython.line .mis { background-color: #FFB0B0; }\n",
".cython.code.run { border-left: 8px solid #B0FFB0; }\n",
".cython.code.mis { border-left: 8px solid #FFB0B0; }\n",
"\n",
".cython.code .py_c_api { color: red; }\n",
".cython.code .py_macro_api { color: #FF7000; }\n",
".cython.code .pyx_c_api { color: #FF3000; }\n",
".cython.code .pyx_macro_api { color: #FF7000; }\n",
".cython.code .refnanny { color: #FFA000; }\n",
".cython.code .trace { color: #FFA000; }\n",
".cython.code .error_goto { color: #FFA000; }\n",
"\n",
".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n",
".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n",
".cython.code .c_attr { color: #0000FF; }\n",
".cython.code .py_call { color: #FF0000; font-weight: bold; }\n",
".cython.code .c_call { color: #0000FF; }\n",
"\n",
".cython.score-0 {background-color: #FFFFff;}\n",
".cython.score-1 {background-color: #FFFFe7;}\n",
".cython.score-2 {background-color: #FFFFd4;}\n",
".cython.score-3 {background-color: #FFFFc4;}\n",
".cython.score-4 {background-color: #FFFFb6;}\n",
".cython.score-5 {background-color: #FFFFaa;}\n",
".cython.score-6 {background-color: #FFFF9f;}\n",
".cython.score-7 {background-color: #FFFF96;}\n",
".cython.score-8 {background-color: #FFFF8d;}\n",
".cython.score-9 {background-color: #FFFF86;}\n",
".cython.score-10 {background-color: #FFFF7f;}\n",
".cython.score-11 {background-color: #FFFF79;}\n",
".cython.score-12 {background-color: #FFFF73;}\n",
".cython.score-13 {background-color: #FFFF6e;}\n",
".cython.score-14 {background-color: #FFFF6a;}\n",
".cython.score-15 {background-color: #FFFF66;}\n",
".cython.score-16 {background-color: #FFFF62;}\n",
".cython.score-17 {background-color: #FFFF5e;}\n",
".cython.score-18 {background-color: #FFFF5b;}\n",
".cython.score-19 {background-color: #FFFF57;}\n",
".cython.score-20 {background-color: #FFFF55;}\n",
".cython.score-21 {background-color: #FFFF52;}\n",
".cython.score-22 {background-color: #FFFF4f;}\n",
".cython.score-23 {background-color: #FFFF4d;}\n",
".cython.score-24 {background-color: #FFFF4b;}\n",
".cython.score-25 {background-color: #FFFF48;}\n",
".cython.score-26 {background-color: #FFFF46;}\n",
".cython.score-27 {background-color: #FFFF44;}\n",
".cython.score-28 {background-color: #FFFF43;}\n",
".cython.score-29 {background-color: #FFFF41;}\n",
".cython.score-30 {background-color: #FFFF3f;}\n",
".cython.score-31 {background-color: #FFFF3e;}\n",
".cython.score-32 {background-color: #FFFF3c;}\n",
".cython.score-33 {background-color: #FFFF3b;}\n",
".cython.score-34 {background-color: #FFFF39;}\n",
".cython.score-35 {background-color: #FFFF38;}\n",
".cython.score-36 {background-color: #FFFF37;}\n",
".cython.score-37 {background-color: #FFFF36;}\n",
".cython.score-38 {background-color: #FFFF35;}\n",
".cython.score-39 {background-color: #FFFF34;}\n",
".cython.score-40 {background-color: #FFFF33;}\n",
".cython.score-41 {background-color: #FFFF32;}\n",
".cython.score-42 {background-color: #FFFF31;}\n",
".cython.score-43 {background-color: #FFFF30;}\n",
".cython.score-44 {background-color: #FFFF2f;}\n",
".cython.score-45 {background-color: #FFFF2e;}\n",
".cython.score-46 {background-color: #FFFF2d;}\n",
".cython.score-47 {background-color: #FFFF2c;}\n",
".cython.score-48 {background-color: #FFFF2b;}\n",
".cython.score-49 {background-color: #FFFF2b;}\n",
".cython.score-50 {background-color: #FFFF2a;}\n",
".cython.score-51 {background-color: #FFFF29;}\n",
".cython.score-52 {background-color: #FFFF29;}\n",
".cython.score-53 {background-color: #FFFF28;}\n",
".cython.score-54 {background-color: #FFFF27;}\n",
".cython.score-55 {background-color: #FFFF27;}\n",
".cython.score-56 {background-color: #FFFF26;}\n",
".cython.score-57 {background-color: #FFFF26;}\n",
".cython.score-58 {background-color: #FFFF25;}\n",
".cython.score-59 {background-color: #FFFF24;}\n",
".cython.score-60 {background-color: #FFFF24;}\n",
".cython.score-61 {background-color: #FFFF23;}\n",
".cython.score-62 {background-color: #FFFF23;}\n",
".cython.score-63 {background-color: #FFFF22;}\n",
".cython.score-64 {background-color: #FFFF22;}\n",
".cython.score-65 {background-color: #FFFF22;}\n",
".cython.score-66 {background-color: #FFFF21;}\n",
".cython.score-67 {background-color: #FFFF21;}\n",
".cython.score-68 {background-color: #FFFF20;}\n",
".cython.score-69 {background-color: #FFFF20;}\n",
".cython.score-70 {background-color: #FFFF1f;}\n",
".cython.score-71 {background-color: #FFFF1f;}\n",
".cython.score-72 {background-color: #FFFF1f;}\n",
".cython.score-73 {background-color: #FFFF1e;}\n",
".cython.score-74 {background-color: #FFFF1e;}\n",
".cython.score-75 {background-color: #FFFF1e;}\n",
".cython.score-76 {background-color: #FFFF1d;}\n",
".cython.score-77 {background-color: #FFFF1d;}\n",
".cython.score-78 {background-color: #FFFF1c;}\n",
".cython.score-79 {background-color: #FFFF1c;}\n",
".cython.score-80 {background-color: #FFFF1c;}\n",
".cython.score-81 {background-color: #FFFF1c;}\n",
".cython.score-82 {background-color: #FFFF1b;}\n",
".cython.score-83 {background-color: #FFFF1b;}\n",
".cython.score-84 {background-color: #FFFF1b;}\n",
".cython.score-85 {background-color: #FFFF1a;}\n",
".cython.score-86 {background-color: #FFFF1a;}\n",
".cython.score-87 {background-color: #FFFF1a;}\n",
".cython.score-88 {background-color: #FFFF1a;}\n",
".cython.score-89 {background-color: #FFFF19;}\n",
".cython.score-90 {background-color: #FFFF19;}\n",
".cython.score-91 {background-color: #FFFF19;}\n",
".cython.score-92 {background-color: #FFFF19;}\n",
".cython.score-93 {background-color: #FFFF18;}\n",
".cython.score-94 {background-color: #FFFF18;}\n",
".cython.score-95 {background-color: #FFFF18;}\n",
".cython.score-96 {background-color: #FFFF18;}\n",
".cython.score-97 {background-color: #FFFF17;}\n",
".cython.score-98 {background-color: #FFFF17;}\n",
".cython.score-99 {background-color: #FFFF17;}\n",
".cython.score-100 {background-color: #FFFF17;}\n",
".cython.score-101 {background-color: #FFFF16;}\n",
".cython.score-102 {background-color: #FFFF16;}\n",
".cython.score-103 {background-color: #FFFF16;}\n",
".cython.score-104 {background-color: #FFFF16;}\n",
".cython.score-105 {background-color: #FFFF16;}\n",
".cython.score-106 {background-color: #FFFF15;}\n",
".cython.score-107 {background-color: #FFFF15;}\n",
".cython.score-108 {background-color: #FFFF15;}\n",
".cython.score-109 {background-color: #FFFF15;}\n",
".cython.score-110 {background-color: #FFFF15;}\n",
".cython.score-111 {background-color: #FFFF15;}\n",
".cython.score-112 {background-color: #FFFF14;}\n",
".cython.score-113 {background-color: #FFFF14;}\n",
".cython.score-114 {background-color: #FFFF14;}\n",
".cython.score-115 {background-color: #FFFF14;}\n",
".cython.score-116 {background-color: #FFFF14;}\n",
".cython.score-117 {background-color: #FFFF14;}\n",
".cython.score-118 {background-color: #FFFF13;}\n",
".cython.score-119 {background-color: #FFFF13;}\n",
".cython.score-120 {background-color: #FFFF13;}\n",
".cython.score-121 {background-color: #FFFF13;}\n",
".cython.score-122 {background-color: #FFFF13;}\n",
".cython.score-123 {background-color: #FFFF13;}\n",
".cython.score-124 {background-color: #FFFF13;}\n",
".cython.score-125 {background-color: #FFFF12;}\n",
".cython.score-126 {background-color: #FFFF12;}\n",
".cython.score-127 {background-color: #FFFF12;}\n",
".cython.score-128 {background-color: #FFFF12;}\n",
".cython.score-129 {background-color: #FFFF12;}\n",
".cython.score-130 {background-color: #FFFF12;}\n",
".cython.score-131 {background-color: #FFFF12;}\n",
".cython.score-132 {background-color: #FFFF11;}\n",
".cython.score-133 {background-color: #FFFF11;}\n",
".cython.score-134 {background-color: #FFFF11;}\n",
".cython.score-135 {background-color: #FFFF11;}\n",
".cython.score-136 {background-color: #FFFF11;}\n",
".cython.score-137 {background-color: #FFFF11;}\n",
".cython.score-138 {background-color: #FFFF11;}\n",
".cython.score-139 {background-color: #FFFF11;}\n",
".cython.score-140 {background-color: #FFFF11;}\n",
".cython.score-141 {background-color: #FFFF10;}\n",
".cython.score-142 {background-color: #FFFF10;}\n",
".cython.score-143 {background-color: #FFFF10;}\n",
".cython.score-144 {background-color: #FFFF10;}\n",
".cython.score-145 {background-color: #FFFF10;}\n",
".cython.score-146 {background-color: #FFFF10;}\n",
".cython.score-147 {background-color: #FFFF10;}\n",
".cython.score-148 {background-color: #FFFF10;}\n",
".cython.score-149 {background-color: #FFFF10;}\n",
".cython.score-150 {background-color: #FFFF0f;}\n",
".cython.score-151 {background-color: #FFFF0f;}\n",
".cython.score-152 {background-color: #FFFF0f;}\n",
".cython.score-153 {background-color: #FFFF0f;}\n",
".cython.score-154 {background-color: #FFFF0f;}\n",
".cython.score-155 {background-color: #FFFF0f;}\n",
".cython.score-156 {background-color: #FFFF0f;}\n",
".cython.score-157 {background-color: #FFFF0f;}\n",
".cython.score-158 {background-color: #FFFF0f;}\n",
".cython.score-159 {background-color: #FFFF0f;}\n",
".cython.score-160 {background-color: #FFFF0f;}\n",
".cython.score-161 {background-color: #FFFF0e;}\n",
".cython.score-162 {background-color: #FFFF0e;}\n",
".cython.score-163 {background-color: #FFFF0e;}\n",
".cython.score-164 {background-color: #FFFF0e;}\n",
".cython.score-165 {background-color: #FFFF0e;}\n",
".cython.score-166 {background-color: #FFFF0e;}\n",
".cython.score-167 {background-color: #FFFF0e;}\n",
".cython.score-168 {background-color: #FFFF0e;}\n",
".cython.score-169 {background-color: #FFFF0e;}\n",
".cython.score-170 {background-color: #FFFF0e;}\n",
".cython.score-171 {background-color: #FFFF0e;}\n",
".cython.score-172 {background-color: #FFFF0e;}\n",
".cython.score-173 {background-color: #FFFF0d;}\n",
".cython.score-174 {background-color: #FFFF0d;}\n",
".cython.score-175 {background-color: #FFFF0d;}\n",
".cython.score-176 {background-color: #FFFF0d;}\n",
".cython.score-177 {background-color: #FFFF0d;}\n",
".cython.score-178 {background-color: #FFFF0d;}\n",
".cython.score-179 {background-color: #FFFF0d;}\n",
".cython.score-180 {background-color: #FFFF0d;}\n",
".cython.score-181 {background-color: #FFFF0d;}\n",
".cython.score-182 {background-color: #FFFF0d;}\n",
".cython.score-183 {background-color: #FFFF0d;}\n",
".cython.score-184 {background-color: #FFFF0d;}\n",
".cython.score-185 {background-color: #FFFF0d;}\n",
".cython.score-186 {background-color: #FFFF0d;}\n",
".cython.score-187 {background-color: #FFFF0c;}\n",
".cython.score-188 {background-color: #FFFF0c;}\n",
".cython.score-189 {background-color: #FFFF0c;}\n",
".cython.score-190 {background-color: #FFFF0c;}\n",
".cython.score-191 {background-color: #FFFF0c;}\n",
".cython.score-192 {background-color: #FFFF0c;}\n",
".cython.score-193 {background-color: #FFFF0c;}\n",
".cython.score-194 {background-color: #FFFF0c;}\n",
".cython.score-195 {background-color: #FFFF0c;}\n",
".cython.score-196 {background-color: #FFFF0c;}\n",
".cython.score-197 {background-color: #FFFF0c;}\n",
".cython.score-198 {background-color: #FFFF0c;}\n",
".cython.score-199 {background-color: #FFFF0c;}\n",
".cython.score-200 {background-color: #FFFF0c;}\n",
".cython.score-201 {background-color: #FFFF0c;}\n",
".cython.score-202 {background-color: #FFFF0c;}\n",
".cython.score-203 {background-color: #FFFF0b;}\n",
".cython.score-204 {background-color: #FFFF0b;}\n",
".cython.score-205 {background-color: #FFFF0b;}\n",
".cython.score-206 {background-color: #FFFF0b;}\n",
".cython.score-207 {background-color: #FFFF0b;}\n",
".cython.score-208 {background-color: #FFFF0b;}\n",
".cython.score-209 {background-color: #FFFF0b;}\n",
".cython.score-210 {background-color: #FFFF0b;}\n",
".cython.score-211 {background-color: #FFFF0b;}\n",
".cython.score-212 {background-color: #FFFF0b;}\n",
".cython.score-213 {background-color: #FFFF0b;}\n",
".cython.score-214 {background-color: #FFFF0b;}\n",
".cython.score-215 {background-color: #FFFF0b;}\n",
".cython.score-216 {background-color: #FFFF0b;}\n",
".cython.score-217 {background-color: #FFFF0b;}\n",
".cython.score-218 {background-color: #FFFF0b;}\n",
".cython.score-219 {background-color: #FFFF0b;}\n",
".cython.score-220 {background-color: #FFFF0b;}\n",
".cython.score-221 {background-color: #FFFF0b;}\n",
".cython.score-222 {background-color: #FFFF0a;}\n",
".cython.score-223 {background-color: #FFFF0a;}\n",
".cython.score-224 {background-color: #FFFF0a;}\n",
".cython.score-225 {background-color: #FFFF0a;}\n",
".cython.score-226 {background-color: #FFFF0a;}\n",
".cython.score-227 {background-color: #FFFF0a;}\n",
".cython.score-228 {background-color: #FFFF0a;}\n",
".cython.score-229 {background-color: #FFFF0a;}\n",
".cython.score-230 {background-color: #FFFF0a;}\n",
".cython.score-231 {background-color: #FFFF0a;}\n",
".cython.score-232 {background-color: #FFFF0a;}\n",
".cython.score-233 {background-color: #FFFF0a;}\n",
".cython.score-234 {background-color: #FFFF0a;}\n",
".cython.score-235 {background-color: #FFFF0a;}\n",
".cython.score-236 {background-color: #FFFF0a;}\n",
".cython.score-237 {background-color: #FFFF0a;}\n",
".cython.score-238 {background-color: #FFFF0a;}\n",
".cython.score-239 {background-color: #FFFF0a;}\n",
".cython.score-240 {background-color: #FFFF0a;}\n",
".cython.score-241 {background-color: #FFFF0a;}\n",
".cython.score-242 {background-color: #FFFF0a;}\n",
".cython.score-243 {background-color: #FFFF0a;}\n",
".cython.score-244 {background-color: #FFFF0a;}\n",
".cython.score-245 {background-color: #FFFF0a;}\n",
".cython.score-246 {background-color: #FFFF09;}\n",
".cython.score-247 {background-color: #FFFF09;}\n",
".cython.score-248 {background-color: #FFFF09;}\n",
".cython.score-249 {background-color: #FFFF09;}\n",
".cython.score-250 {background-color: #FFFF09;}\n",
".cython.score-251 {background-color: #FFFF09;}\n",
".cython.score-252 {background-color: #FFFF09;}\n",
".cython.score-253 {background-color: #FFFF09;}\n",
".cython.score-254 {background-color: #FFFF09;}\n",
".cython .hll { background-color: #ffffcc }\n",
".cython { background: #f8f8f8; }\n",
".cython .c { color: #408080; font-style: italic } /* Comment */\n",
".cython .err { border: 1px solid #FF0000 } /* Error */\n",
".cython .k { color: #008000; font-weight: bold } /* Keyword */\n",
".cython .o { color: #666666 } /* Operator */\n",
".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n",
".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
".cython .gd { color: #A00000 } /* Generic.Deleted */\n",
".cython .ge { font-style: italic } /* Generic.Emph */\n",
".cython .gr { color: #FF0000 } /* Generic.Error */\n",
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
".cython .gi { color: #00A000 } /* Generic.Inserted */\n",
".cython .go { color: #888888 } /* Generic.Output */\n",
".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
".cython .gs { font-weight: bold } /* Generic.Strong */\n",
".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
".cython .gt { color: #0044DD } /* Generic.Traceback */\n",
".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
".cython .kp { color: #008000 } /* Keyword.Pseudo */\n",
".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
".cython .kt { color: #B00040 } /* Keyword.Type */\n",
".cython .m { color: #666666 } /* Literal.Number */\n",
".cython .s { color: #BA2121 } /* Literal.String */\n",
".cython .na { color: #7D9029 } /* Name.Attribute */\n",
".cython .nb { color: #008000 } /* Name.Builtin */\n",
".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
".cython .no { color: #880000 } /* Name.Constant */\n",
".cython .nd { color: #AA22FF } /* Name.Decorator */\n",
".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
".cython .nf { color: #0000FF } /* Name.Function */\n",
".cython .nl { color: #A0A000 } /* Name.Label */\n",
".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
".cython .nv { color: #19177C } /* Name.Variable */\n",
".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
".cython .w { color: #bbbbbb } /* Text.Whitespace */\n",
".cython .mb { color: #666666 } /* Literal.Number.Bin */\n",
".cython .mf { color: #666666 } /* Literal.Number.Float */\n",
".cython .mh { color: #666666 } /* Literal.Number.Hex */\n",
".cython .mi { color: #666666 } /* Literal.Number.Integer */\n",
".cython .mo { color: #666666 } /* Literal.Number.Oct */\n",
".cython .sa { color: #BA2121 } /* Literal.String.Affix */\n",
".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
".cython .sc { color: #BA2121 } /* Literal.String.Char */\n",
".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n",
".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
".cython .sx { color: #008000 } /* Literal.String.Other */\n",
".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n",
".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n",
".cython .ss { color: #19177C } /* Literal.String.Symbol */\n",
".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
".cython .fm { color: #0000FF } /* Name.Function.Magic */\n",
".cython .vc { color: #19177C } /* Name.Variable.Class */\n",
".cython .vg { color: #19177C } /* Name.Variable.Global */\n",
".cython .vi { color: #19177C } /* Name.Variable.Instance */\n",
".cython .vm { color: #19177C } /* Name.Variable.Magic */\n",
".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
" </style>\n",
"</head>\n",
"<body class=\"cython\">\n",
"<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.28.3</span></p>\n",
"<p>\n",
" <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n",
" Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n",
"</p>\n",
"<div class=\"cython\"><pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">01</span>: <span class=\"c\">#cython: cdivision=True, boundscheck=False, nonecheck=False, wraparound=False</span></pre>\n",
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_test, __pyx_t_1) &lt; 0) <span class='error_goto'>__PYX_ERR(0, 1, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">02</span>: </pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">03</span>: </pre>\n",
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">04</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n",
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_np, __pyx_t_1) &lt; 0) <span class='error_goto'>__PYX_ERR(0, 4, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">cnp</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">06</span>: </pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">07</span>: </pre>\n",
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">08</span>: <span class=\"k\">cdef</span> <span class=\"kr\">inline</span> <span class=\"kt\">cnp</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">_sq_distance</span><span class=\"p\">(</span><span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">intp_t</span><span class=\"p\">[::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">intp_t</span><span class=\"p\">[::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">b</span><span class=\"p\">):</span></pre>\n",
"<pre class='cython code score-0 '>static CYTHON_INLINE __pyx_t_5numpy_intp_t __pyx_f_46_cython_magic_0299cda6b7dca58eb058d0fde159267e__sq_distance(__Pyx_memviewslice __pyx_v_a, __Pyx_memviewslice __pyx_v_b) {\n",
" __pyx_t_5numpy_intp_t __pyx_v_d;\n",
" Py_ssize_t __pyx_v_i;\n",
" __pyx_t_5numpy_intp_t __pyx_r;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"_sq_distance\", 0);\n",
"/* … */\n",
" /* function exit code */\n",
" __pyx_L0:;\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">09</span>: <span class=\"c\"># Compute squared euclidean distance</span></pre>\n",
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">10</span>: <span class=\"k\">cdef</span> <span class=\"kt\">cnp</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">d</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_v_d = 0;\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">11</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]):</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_1 = (__pyx_v_a.shape[0]);\n",
" __pyx_t_2 = __pyx_t_1;\n",
" for (__pyx_t_3 = 0; __pyx_t_3 &lt; __pyx_t_2; __pyx_t_3+=1) {\n",
" __pyx_v_i = __pyx_t_3;\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">12</span>: <span class=\"n\">d</span> <span class=\"o\">+=</span> <span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">b</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">])</span> <span class=\"o\">**</span> <span class=\"mf\">2</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_4 = __pyx_v_i;\n",
" __pyx_t_5 = __pyx_v_i;\n",
" __pyx_v_d = (__pyx_v_d + __Pyx_pow_long(((long)((*((__pyx_t_5numpy_intp_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_intp_t *) __pyx_v_a.data) + __pyx_t_4)) ))) - (*((__pyx_t_5numpy_intp_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_intp_t *) __pyx_v_b.data) + __pyx_t_5)) ))))), 2));\n",
" }\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">13</span>: <span class=\"k\">return</span> <span class=\"n\">d</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_r = __pyx_v_d;\n",
" goto __pyx_L0;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">14</span>: </pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">15</span>: </pre>\n",
"<pre class=\"cython line score-59\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">16</span>: <span class=\"k\">def</span> <span class=\"nf\">select_by_distance</span><span class=\"p\">(</span><span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">intp_t</span><span class=\"p\">[:,</span> <span class=\"p\">::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">points</span><span class=\"p\">,</span></pre>\n",
"<pre class='cython code score-59 '>/* Python wrapper */\n",
"static PyObject *__pyx_pw_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_1select_by_distance(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyMethodDef __pyx_mdef_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_1select_by_distance = {\"select_by_distance\", (PyCFunction)__pyx_pw_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_1select_by_distance, METH_VARARGS|METH_KEYWORDS, 0};\n",
"static PyObject *__pyx_pw_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_1select_by_distance(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
" __Pyx_memviewslice __pyx_v_points = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
" __Pyx_memviewslice __pyx_v_labels = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
" __pyx_t_5numpy_intp_t __pyx_v_distance;\n",
" PyObject *__pyx_r = 0;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"select_by_distance (wrapper)\", 0);\n",
" {\n",
" static PyObject **__pyx_pyargnames[] = {&amp;__pyx_n_s_points,&amp;__pyx_n_s_labels,&amp;__pyx_n_s_distance,0};\n",
" PyObject* values[3] = {0,0,0};\n",
" if (unlikely(__pyx_kwds)) {\n",
" Py_ssize_t kw_args;\n",
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
" switch (pos_args) {\n",
" case 3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n",
" CYTHON_FALLTHROUGH;\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" CYTHON_FALLTHROUGH;\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" CYTHON_FALLTHROUGH;\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
" switch (pos_args) {\n",
" case 0:\n",
" if (likely((values[0] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_points)) != 0)) kw_args--;\n",
" else goto __pyx_L5_argtuple_error;\n",
" CYTHON_FALLTHROUGH;\n",
" case 1:\n",
" if (likely((values[1] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_labels)) != 0)) kw_args--;\n",
" else {\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"select_by_distance\", 1, 3, 3, 1); <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n",
" }\n",
" CYTHON_FALLTHROUGH;\n",
" case 2:\n",
" if (likely((values[2] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_distance)) != 0)) kw_args--;\n",
" else {\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"select_by_distance\", 1, 3, 3, 2); <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n",
" }\n",
" }\n",
" if (unlikely(kw_args &gt; 0)) {\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"select_by_distance\") &lt; 0)) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n",
" }\n",
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 3) {\n",
" goto __pyx_L5_argtuple_error;\n",
" } else {\n",
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n",
" }\n",
" __pyx_v_points = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_intp_t(values[0], PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_v_points.memview)) __PYX_ERR(0, 16, __pyx_L3_error)</span>\n",
" __pyx_v_labels = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_int64_t(values[1], PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_v_labels.memview)) __PYX_ERR(0, 17, __pyx_L3_error)</span>\n",
" __pyx_v_distance = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(values[2]); if (unlikely((__pyx_v_distance == ((npy_intp)-1)) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 18, __pyx_L3_error)</span>\n",
" }\n",
" goto __pyx_L4_argument_unpacking_done;\n",
" __pyx_L5_argtuple_error:;\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"select_by_distance\", 1, 3, 3, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n",
" __pyx_L3_error:;\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_0299cda6b7dca58eb058d0fde159267e.select_by_distance\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return NULL;\n",
" __pyx_L4_argument_unpacking_done:;\n",
" __pyx_r = __pyx_pf_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_select_by_distance(__pyx_self, __pyx_v_points, __pyx_v_labels, __pyx_v_distance);\n",
"\n",
" /* function exit code */\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"static PyObject *__pyx_pf_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_select_by_distance(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_points, __Pyx_memviewslice __pyx_v_labels, __pyx_t_5numpy_intp_t __pyx_v_distance) {\n",
" __Pyx_memviewslice __pyx_v_keep = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
" __pyx_t_5numpy_intp_t __pyx_v_i;\n",
" __pyx_t_5numpy_intp_t __pyx_v_j;\n",
" __pyx_t_5numpy_intp_t __pyx_v_sq_distance;\n",
" PyObject *__pyx_v_labels_to_delete = 0;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"select_by_distance\", 0);\n",
"/* … */\n",
" /* function exit code */\n",
" __pyx_L1_error:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_13, 1);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_14, 1);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_17);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_18);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_19);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_20);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_22);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_23, 1);\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_0299cda6b7dca58eb058d0fde159267e.select_by_distance\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = NULL;\n",
" __pyx_L0:;\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_v_keep, 1);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_labels_to_delete);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_v_points, 1);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_v_labels, 1);\n",
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return __pyx_r;\n",
"}\n",
"/* … */\n",
" __pyx_tuple__31 = <span class='py_c_api'>PyTuple_Pack</span>(8, __pyx_n_s_points, __pyx_n_s_labels, __pyx_n_s_distance, __pyx_n_s_keep, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_sq_distance, __pyx_n_s_labels_to_delete);<span class='error_goto'> if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 16, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__31);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__31);\n",
"/* … */\n",
" __pyx_t_1 = PyCFunction_NewEx(&amp;__pyx_mdef_46_cython_magic_0299cda6b7dca58eb058d0fde159267e_1select_by_distance, NULL, __pyx_n_s_cython_magic_0299cda6b7dca58eb0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_select_by_distance, __pyx_t_1) &lt; 0) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_codeobj__32 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(3, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_lg_cache_ipython_cython__c, __pyx_n_s_select_by_distance, 16, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 16, __pyx_L1_error)</span>\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">17</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">int64_t</span><span class=\"p\">[::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">labels</span><span class=\"p\">,</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">18</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">intp_t</span> <span class=\"n\">distance</span><span class=\"p\">):</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">19</span>: <span class=\"k\">cdef</span><span class=\"p\">:</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">20</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">uint8_t</span><span class=\"p\">[::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">keep</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">21</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">intp_t</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">j</span><span class=\"p\">,</span> <span class=\"n\">sq_distance</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">22</span>: <span class=\"nb\">set</span> <span class=\"n\">labels_to_delete</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">23</span>: </pre>\n",
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">24</span>: <span class=\"n\">sq_distance</span> <span class=\"o\">=</span> <span class=\"n\">distance</span> <span class=\"o\">*</span> <span class=\"n\">distance</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_v_sq_distance = (__pyx_v_distance * __pyx_v_distance);\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">25</span>: </pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">26</span>: <span class=\"c\"># Find labels that are to close to each other</span></pre>\n",
"<pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">27</span>: <span class=\"n\">labels_to_delete</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">()</span></pre>\n",
"<pre class='cython code score-5 '> __pyx_t_1 = <span class='py_c_api'>PySet_New</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_v_labels_to_delete = ((PyObject*)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">28</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]):</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_2 = (__pyx_v_points.shape[0]);\n",
" __pyx_t_3 = __pyx_t_2;\n",
" for (__pyx_t_4 = 0; __pyx_t_4 &lt; __pyx_t_3; __pyx_t_4+=1) {\n",
" __pyx_v_i = __pyx_t_4;\n",
"</pre><pre class=\"cython line score-3\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">29</span>: <span class=\"k\">if</span> <span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"n\">labels_to_delete</span><span class=\"p\">:</span></pre>\n",
"<pre class='cython code score-3 '> __pyx_t_5 = __pyx_v_i;\n",
" __pyx_t_1 = __Pyx_PyInt_From_npy_int64((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_int64_t *) __pyx_v_labels.data) + __pyx_t_5)) ))));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_6 = (<span class='pyx_c_api'>__Pyx_PySet_ContainsTF</span>(__pyx_t_1, __pyx_v_labels_to_delete, Py_EQ)); if (unlikely(__pyx_t_6 &lt; 0)) <span class='error_goto'>__PYX_ERR(0, 29, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_7 = (__pyx_t_6 != 0);\n",
" if (__pyx_t_7) {\n",
"/* … */\n",
" }\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">30</span>: <span class=\"k\">continue</span></pre>\n",
"<pre class='cython code score-0 '> goto __pyx_L3_continue;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">31</span>: </pre>\n",
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">32</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]):</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_8 = (__pyx_v_points.shape[0]);\n",
" __pyx_t_9 = __pyx_t_8;\n",
" for (__pyx_t_10 = 0; __pyx_t_10 &lt; __pyx_t_9; __pyx_t_10+=1) {\n",
" __pyx_v_j = __pyx_t_10;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">33</span>: <span class=\"c\"># Naive approach: compare with every other maxima</span></pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">34</span>: <span class=\"c\"># Very slow if many maxima are present</span></pre>\n",
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">35</span>: <span class=\"k\">if</span> <span class=\"p\">(</span></pre>\n",
"<pre class='cython code score-0 '> if (__pyx_t_7) {\n",
"/* … */\n",
" }\n",
" }\n",
" __pyx_L3_continue:;\n",
" }\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">36</span>: <span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">j</span><span class=\"p\">]</span> <span class=\"ow\">and</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_11 = __pyx_v_i;\n",
" __pyx_t_12 = __pyx_v_j;\n",
" __pyx_t_6 = (((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_int64_t *) __pyx_v_labels.data) + __pyx_t_11)) ))) != (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_int64_t *) __pyx_v_labels.data) + __pyx_t_12)) )))) != 0);\n",
" if (__pyx_t_6) {\n",
" } else {\n",
" __pyx_t_7 = __pyx_t_6;\n",
" goto __pyx_L9_bool_binop_done;\n",
" }\n",
"</pre><pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">37</span>: <span class=\"n\">_sq_distance</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"p\">:],</span> <span class=\"n\">points</span><span class=\"p\">[</span><span class=\"n\">j</span><span class=\"p\">,</span> <span class=\"p\">:])</span> <span class=\"o\">&lt;</span> <span class=\"n\">sq_distance</span></pre>\n",
"<pre class='cython code score-10 '> __pyx_t_13.data = __pyx_v_points.data;\n",
" __pyx_t_13.memview = __pyx_v_points.memview;\n",
" __PYX_INC_MEMVIEW(&amp;__pyx_t_13, 0);\n",
" {\n",
" Py_ssize_t __pyx_tmp_idx = __pyx_v_i;\n",
" Py_ssize_t __pyx_tmp_shape = __pyx_v_points.shape[0];\n",
" Py_ssize_t __pyx_tmp_stride = __pyx_v_points.strides[0];\n",
" if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
" __pyx_tmp_idx += __pyx_tmp_shape;\n",
" if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 0)\");\n",
" <span class='error_goto'>__PYX_ERR(0, 37, __pyx_L1_error)</span>\n",
" }\n",
" __pyx_t_13.data += __pyx_tmp_idx * __pyx_tmp_stride;\n",
"}\n",
"\n",
"__pyx_t_13.shape[0] = __pyx_v_points.shape[1];\n",
"__pyx_t_13.strides[0] = __pyx_v_points.strides[1];\n",
" __pyx_t_13.suboffsets[0] = -1;\n",
"\n",
"__pyx_t_14.data = __pyx_v_points.data;\n",
" __pyx_t_14.memview = __pyx_v_points.memview;\n",
" __PYX_INC_MEMVIEW(&amp;__pyx_t_14, 0);\n",
" {\n",
" Py_ssize_t __pyx_tmp_idx = __pyx_v_j;\n",
" Py_ssize_t __pyx_tmp_shape = __pyx_v_points.shape[0];\n",
" Py_ssize_t __pyx_tmp_stride = __pyx_v_points.strides[0];\n",
" if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
" __pyx_tmp_idx += __pyx_tmp_shape;\n",
" if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 0)\");\n",
" <span class='error_goto'>__PYX_ERR(0, 37, __pyx_L1_error)</span>\n",
" }\n",
" __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;\n",
"}\n",
"\n",
"__pyx_t_14.shape[0] = __pyx_v_points.shape[1];\n",
"__pyx_t_14.strides[0] = __pyx_v_points.strides[1];\n",
" __pyx_t_14.suboffsets[0] = -1;\n",
"\n",
"__pyx_t_6 = ((__pyx_f_46_cython_magic_0299cda6b7dca58eb058d0fde159267e__sq_distance(__pyx_t_13, __pyx_t_14) &lt; __pyx_v_sq_distance) != 0);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_13, 1);\n",
" __pyx_t_13.memview = NULL;\n",
" __pyx_t_13.data = NULL;\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_14, 1);\n",
" __pyx_t_14.memview = NULL;\n",
" __pyx_t_14.data = NULL;\n",
" __pyx_t_7 = __pyx_t_6;\n",
" __pyx_L9_bool_binop_done:;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">38</span>: <span class=\"p\">):</span></pre>\n",
"<pre class=\"cython line score-6\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"n\">labels_to_delete</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">j</span><span class=\"p\">])</span></pre>\n",
"<pre class='cython code score-6 '> __pyx_t_15 = __pyx_v_j;\n",
" __pyx_t_1 = __Pyx_PyInt_From_npy_int64((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_int64_t *) __pyx_v_labels.data) + __pyx_t_15)) ))));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_16 = <span class='py_c_api'>PySet_Add</span>(__pyx_v_labels_to_delete, __pyx_t_1);<span class='error_goto'> if (unlikely(__pyx_t_16 == ((int)-1))) __PYX_ERR(0, 39, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">40</span>: </pre>\n",
"<pre class=\"cython line score-0\">&#xA0;<span class=\"\">41</span>: <span class=\"c\"># Set appropriate flags to False</span></pre>\n",
"<pre class=\"cython line score-55\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">42</span>: <span class=\"n\">keep</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uint8</span><span class=\"p\">)</span></pre>\n",
"<pre class='cython code score-55 '> __pyx_t_17 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_17);\n",
" __pyx_t_18 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_17, __pyx_n_s_ones);<span class='error_goto'> if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_18);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_17); __pyx_t_17 = 0;\n",
" __pyx_t_17 = <span class='py_c_api'>PyInt_FromSsize_t</span>((__pyx_v_points.shape[0]));<span class='error_goto'> if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_17);\n",
" __pyx_t_19 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_19);\n",
" __pyx_t_20 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_19, __pyx_n_s_uint8);<span class='error_goto'> if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_20);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_19); __pyx_t_19 = 0;\n",
" __pyx_t_19 = NULL;\n",
" __pyx_t_21 = 0;\n",
" if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_18))) {\n",
" __pyx_t_19 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_18);\n",
" if (likely(__pyx_t_19)) {\n",
" PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_18);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_19);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_18, function);\n",
" __pyx_t_21 = 1;\n",
" }\n",
" }\n",
" #if CYTHON_FAST_PYCALL\n",
" if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_18)) {\n",
" PyObject *__pyx_temp[3] = {__pyx_t_19, __pyx_t_17, __pyx_t_20};\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_18, __pyx_temp+1-__pyx_t_21, 2+__pyx_t_21);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_19); __pyx_t_19 = 0;\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_17); __pyx_t_17 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_20); __pyx_t_20 = 0;\n",
" } else\n",
" #endif\n",
" #if CYTHON_FAST_PYCCALL\n",
" if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_18)) {\n",
" PyObject *__pyx_temp[3] = {__pyx_t_19, __pyx_t_17, __pyx_t_20};\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_18, __pyx_temp+1-__pyx_t_21, 2+__pyx_t_21);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_19); __pyx_t_19 = 0;\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_17); __pyx_t_17 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_20); __pyx_t_20 = 0;\n",
" } else\n",
" #endif\n",
" {\n",
" __pyx_t_22 = <span class='py_c_api'>PyTuple_New</span>(2+__pyx_t_21);<span class='error_goto'> if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_22);\n",
" if (__pyx_t_19) {\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_19); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_22, 0, __pyx_t_19); __pyx_t_19 = NULL;\n",
" }\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_17);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_22, 0+__pyx_t_21, __pyx_t_17);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_20);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_22, 1+__pyx_t_21, __pyx_t_20);\n",
" __pyx_t_17 = 0;\n",
" __pyx_t_20 = 0;\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_18, __pyx_t_22, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_22); __pyx_t_22 = 0;\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_18); __pyx_t_18 = 0;\n",
" __pyx_t_23 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_uint8_t(__pyx_t_1, PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_t_23.memview)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_v_keep = __pyx_t_23;\n",
" __pyx_t_23.memview = NULL;\n",
" __pyx_t_23.data = NULL;\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">43</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]):</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_2 = (__pyx_v_points.shape[0]);\n",
" __pyx_t_3 = __pyx_t_2;\n",
" for (__pyx_t_4 = 0; __pyx_t_4 &lt; __pyx_t_3; __pyx_t_4+=1) {\n",
" __pyx_v_i = __pyx_t_4;\n",
"</pre><pre class=\"cython line score-3\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">44</span>: <span class=\"k\">if</span> <span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"n\">labels_to_delete</span><span class=\"p\">:</span></pre>\n",
"<pre class='cython code score-3 '> __pyx_t_24 = __pyx_v_i;\n",
" __pyx_t_1 = __Pyx_PyInt_From_npy_int64((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_int64_t *) __pyx_v_labels.data) + __pyx_t_24)) ))));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_7 = (<span class='pyx_c_api'>__Pyx_PySet_ContainsTF</span>(__pyx_t_1, __pyx_v_labels_to_delete, Py_EQ)); if (unlikely(__pyx_t_7 &lt; 0)) <span class='error_goto'>__PYX_ERR(0, 44, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_6 = (__pyx_t_7 != 0);\n",
" if (__pyx_t_6) {\n",
"/* … */\n",
" }\n",
" }\n",
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">45</span>: <span class=\"n\">keep</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n",
"<pre class='cython code score-0 '> __pyx_t_25 = __pyx_v_i;\n",
" *((__pyx_t_5numpy_uint8_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_uint8_t *) __pyx_v_keep.data) + __pyx_t_25)) )) = 0;\n",
"</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">46</span>: </pre>\n",
"<pre class=\"cython line score-24\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">47</span>: <span class=\"k\">return</span> <span class=\"n\">keep</span><span class=\"o\">.</span><span class=\"n\">base</span><span class=\"o\">.</span><span class=\"n\">view</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">bool</span><span class=\"p\">)</span></pre>\n",
"<pre class='cython code score-24 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_keep, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_uint8_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_uint8_t, 0);;<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_18 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_base);<span class='error_goto'> if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_18);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_18, __pyx_n_s_view);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_18); __pyx_t_18 = 0;\n",
" __pyx_t_18 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_18);\n",
" __pyx_t_22 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_22);\n",
" __pyx_t_20 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_22, __pyx_n_s_bool);<span class='error_goto'> if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_20);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_22); __pyx_t_22 = 0;\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_18, __pyx_n_s_dtype, __pyx_t_20) &lt; 0) <span class='error_goto'>__PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_20); __pyx_t_20 = 0;\n",
" __pyx_t_20 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_1, __pyx_empty_tuple, __pyx_t_18);<span class='error_goto'> if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 47, __pyx_L1_error)</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_20);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_18); __pyx_t_18 = 0;\n",
" __pyx_r = __pyx_t_20;\n",
" __pyx_t_20 = 0;\n",
" goto __pyx_L0;\n",
"</pre></div></body></html>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%cython -a\n",
"#cython: cdivision=True, boundscheck=False, nonecheck=False, wraparound=False\n",
"\n",
"\n",
"import numpy as np\n",
"cimport numpy as cnp\n",
"\n",
"\n",
"cdef inline cnp.intp_t _sq_distance(cnp.intp_t[::1] a, cnp.intp_t[::1] b):\n",
" # Compute squared euclidean distance\n",
" cdef cnp.intp_t d = 0\n",
" for i in range(a.shape[0]):\n",
" d += (a[i] - b[i]) ** 2\n",
" return d\n",
"\n",
"\n",
"def select_by_distance(cnp.intp_t[:, ::1] points,\n",
" cnp.int64_t[::1] labels,\n",
" cnp.intp_t distance):\n",
" cdef:\n",
" cnp.uint8_t[::1] keep\n",
" cnp.intp_t i, j, sq_distance\n",
" set labels_to_delete\n",
" \n",
" sq_distance = distance * distance\n",
"\n",
" # Find labels that are to close to each other\n",
" labels_to_delete = set()\n",
" for i in range(points.shape[0]):\n",
" if labels[i] in labels_to_delete:\n",
" continue\n",
"\n",
" for j in range(points.shape[0]):\n",
" # Naive approach: compare with every other maxima\n",
" # Very slow if many maxima are present\n",
" if (\n",
" labels[i] != labels[j] and\n",
" _sq_distance(points[i, :], points[j, :]) < sq_distance\n",
" ):\n",
" labels_to_delete.add(labels[j])\n",
"\n",
" # Set appropriate flags to False\n",
" keep = np.ones(points.shape[0], np.uint8)\n",
" for i in range(points.shape[0]):\n",
" if labels[i] in labels_to_delete:\n",
" keep[i] = 0\n",
"\n",
" return keep.base.view(dtype=np.bool)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from skimage.data import moon\n",
"from skimage.morphology import local_maxima\n",
"from skimage.measure import label\n",
"\n",
"\n",
"image = moon()[:200, :200]\n",
"\n",
"maxima = local_maxima(image)\n",
"maxima_idx = np.nonzero(maxima)\n",
"\n",
"by_height = np.argsort(image[maxima_idx])\n",
"maxima_idx = tuple(axis[by_height] for axis in maxima_idx)\n",
"\n",
"labels = label(maxima)[maxima_idx]\n",
"\n",
"\n",
"keep = select_by_distance(np.stack(maxima_idx, axis=1), labels, 10)\n",
"\n",
"maxima_idx_filt = tuple(axis[~keep] for axis in maxima_idx)\n",
"\n",
"maxima_filt = maxima.copy()\n",
"maxima_filt[maxima_idx_filt] = 0"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f3d2e521390>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(maxima)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f3d2e4a7eb8>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(maxima_filt)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f3d2e484ac8>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(maxima - maxima_filt)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment