Created
July 15, 2018 12:00
-
-
Save lagru/142a9613e2233cbde47dc783c071e717 to your computer and use it in GitHub Desktop.
select_by_distance.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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) < 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\"> <span class=\"\">02</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <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) < 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\"> <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\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <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\"> <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 < __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\"> <span class=\"\">14</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <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[] = {&__pyx_n_s_points,&__pyx_n_s_labels,&__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 > 0)) {\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"select_by_distance\") < 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)) && <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(&__pyx_t_13, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__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(&__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(&__pyx_v_keep, 1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_labels_to_delete);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_points, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__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(&__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) < 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\"> <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\"> <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\"> <span class=\"\">19</span>: <span class=\"k\">cdef</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <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\"> <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\"> <span class=\"\">22</span>: <span class=\"nb\">set</span> <span class=\"n\">labels_to_delete</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <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\"> <span class=\"\">25</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <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 < __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 < 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\"> <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 < __pyx_t_9; __pyx_t_10+=1) {\n", | |
" __pyx_v_j = __pyx_t_10;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">33</span>: <span class=\"c\"># Naive approach: compare with every other maxima</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <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\"><</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(&__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 && (__pyx_tmp_idx < 0))\n", | |
" __pyx_tmp_idx += __pyx_tmp_shape;\n", | |
" if (0 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __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(&__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 && (__pyx_tmp_idx < 0))\n", | |
" __pyx_tmp_idx += __pyx_tmp_shape;\n", | |
" if (0 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __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) < __pyx_v_sq_distance) != 0);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_13, 1);\n", | |
" __pyx_t_13.memview = NULL;\n", | |
" __pyx_t_13.data = NULL;\n", | |
" __PYX_XDEC_MEMVIEW(&__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\"> <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\"> <span class=\"\">40</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <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 && 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 < __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 < 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\"> <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) < 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