Created
July 24, 2014 10:03
-
-
Save Midnighter/b81d5732a0ef88f2e185 to your computer and use it in GitHub Desktop.
pairwise euclidean distance with missing values
This file contains hidden or 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
{ | |
"metadata": { | |
"name": "", | |
"signature": "sha256:147ed090e6fee578dc258feff216b510843c3c20a0b017558b5300309a20826d" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import numpy as np\n", | |
"\n", | |
"import distance\n", | |
"\n", | |
"from numpy.linalg import norm\n", | |
"from scipy.spatial.distance import pdist" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def nan_pdist(data):\n", | |
" m = data.shape[0]\n", | |
" dm = np.zeros(m * (m - 1) // 2, dtype=float)\n", | |
" mask = np.isfinite(data)\n", | |
" vec_mask = np.zeros(data.shape[1], dtype=bool)\n", | |
" k = 0\n", | |
" for i in range(m - 1):\n", | |
" for j in range(i + 1, m):\n", | |
" vec_mask = np.logical_and(mask[i], mask[j])\n", | |
" dm[k] = norm(data[i][vec_mask] - data[j][vec_mask])\n", | |
" k += 1\n", | |
" return dm" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%load_ext cythonmagic" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%%cython -a -lm\n", | |
"\n", | |
"cimport cython\n", | |
"import numpy as np\n", | |
"cimport numpy as np\n", | |
"\n", | |
"from libc.math cimport sqrt\n", | |
"from numpy cimport (PyArray_DIMS,)\n", | |
"\n", | |
"\n", | |
"np.import_array()\n", | |
"\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"cdef inline double nan_euclidean(const double[::1] u, const double[::1] v, const Py_ssize_t n):\n", | |
" cdef Py_ssize_t c = 0\n", | |
" cdef double a = 0.0\n", | |
" cdef double b = 0.0\n", | |
" cdef double d = 0.0\n", | |
" cdef double asum = 0.0\n", | |
" for c in range(n):\n", | |
" a = u[c]\n", | |
" if a != a:\n", | |
" continue\n", | |
" b = v[c]\n", | |
" if b != b:\n", | |
" continue\n", | |
" d = a - b\n", | |
" asum += d * d\n", | |
" return sqrt(asum)\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"cdef inline double nan_euclidean2(const double[::1] u, const double[::1] v, const Py_ssize_t n):\n", | |
" cdef Py_ssize_t c = 0\n", | |
" cdef double d = 0.0\n", | |
" cdef double a = 0.0\n", | |
" cdef double b = 0.0\n", | |
" cdef double asum = 0.0\n", | |
" for c in range(n):\n", | |
" a = u[c]\n", | |
" b = v[c]\n", | |
" if a == a and b == b:\n", | |
" d = a - b\n", | |
" asum += d * d\n", | |
" return sqrt(asum)\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def nan_pdist2(np.ndarray[np.float64_t, ndim=2] data):\n", | |
" cdef np.npy_intp *dim = PyArray_DIMS(data)\n", | |
" cdef Py_ssize_t m = dim[0]\n", | |
" cdef Py_ssize_t n = dim[1]\n", | |
" cdef Py_ssize_t i = 0\n", | |
" cdef Py_ssize_t j = 0\n", | |
" cdef Py_ssize_t k = 0\n", | |
" cdef double[::1] first\n", | |
" cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)\n", | |
" for i in range(m - 1):\n", | |
" first = data[i]\n", | |
" for j in range(i + 1, m):\n", | |
" dm[k] = nan_euclidean2(first, data[j], n)\n", | |
" k += 1\n", | |
" return dm\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def nan_pdist3(np.ndarray[np.float64_t, ndim=2] data):\n", | |
" cdef np.npy_intp *dim = PyArray_DIMS(data)\n", | |
" cdef Py_ssize_t m = dim[0]\n", | |
" cdef Py_ssize_t n = dim[1]\n", | |
" cdef Py_ssize_t i = 0\n", | |
" cdef Py_ssize_t j = 0\n", | |
" cdef Py_ssize_t c = 0\n", | |
" cdef Py_ssize_t k = 0\n", | |
" cdef double d = 0.0\n", | |
" cdef double[:] column\n", | |
" cdef double[:, :] cont = data\n", | |
" cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)\n", | |
" for c in range(n):\n", | |
" column = cont[:, c]\n", | |
" k = 0\n", | |
" for i in range(m - 1):\n", | |
" if column[i] != column[i]:\n", | |
" k += m - i - 1\n", | |
" continue\n", | |
" for j in range(i + 1, m):\n", | |
" if column[j] == column[j]:\n", | |
" d = column[i] - column[j]\n", | |
" dm[k] += d * d\n", | |
" k += 1\n", | |
" return np.sqrt(dm)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.20.2 on Thu Jul 24 11:42:21 2014 -->\n", | |
"<html>\n", | |
"\n", | |
"<head>\n", | |
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
"<style type=\"text/css\">\n", | |
"\n", | |
"body { font-family: courier; font-size: 12; }\n", | |
"\n", | |
".code { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n", | |
".py_c_api { color: red; }\n", | |
".py_macro_api { color: #FF7000; }\n", | |
".pyx_c_api { color: #FF3000; }\n", | |
".pyx_macro_api { color: #FF7000; }\n", | |
".refnanny { color: #FFA000; }\n", | |
"\n", | |
".error_goto { color: #FFA000; }\n", | |
"\n", | |
".tag { }\n", | |
"\n", | |
".coerce { color: #008000; border: 1px dotted #008000 }\n", | |
"\n", | |
".py_attr { color: #FF0000; font-weight: bold; }\n", | |
".c_attr { color: #0000FF; }\n", | |
"\n", | |
".py_call { color: #FF0000; font-weight: bold; }\n", | |
".c_call { color: #0000FF; }\n", | |
"\n", | |
".line { margin: 0em }\n", | |
"\n", | |
"</style>\n", | |
"<script>\n", | |
"function toggleDiv(id) {\n", | |
" theDiv = document.getElementById(id);\n", | |
" if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n", | |
" else theDiv.style.display = 'none';\n", | |
"}\n", | |
"</script>\n", | |
"</head>\n", | |
" <body>\n", | |
"<p>Generated by Cython 0.20.2 on Thu Jul 24 11:42:21 2014\n", | |
"<pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line1\")'> 1: </pre>\n", | |
"<pre id='line1' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF79' onclick='toggleDiv(\"line2\")'> 2: cimport cython</pre>\n", | |
"<pre id='line2' class='code' style='background-color: #FFFF79'> __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFF8d' onclick='toggleDiv(\"line3\")'> 3: import numpy as np</pre>\n", | |
"<pre id='line3' class='code' style='background-color: #FFFF8d'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: cimport numpy as np</pre>\n", | |
"<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line5\")'> 5: </pre>\n", | |
"<pre id='line5' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: from libc.math cimport sqrt</pre>\n", | |
"<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line7\")'> 7: from numpy cimport (PyArray_DIMS,)</pre>\n", | |
"<pre id='line7' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line8\")'> 8: </pre>\n", | |
"<pre id='line8' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line9\")'> 9: </pre>\n", | |
"<pre id='line9' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line10\")'> 10: np.import_array()</pre>\n", | |
"<pre id='line10' class='code' style='background-color: #FFFFff'> import_array();\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line11\")'> 11: </pre>\n", | |
"<pre id='line11' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line12\")'> 12: </pre>\n", | |
"<pre id='line12' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line13\")'> 13: @cython.boundscheck(False)</pre>\n", | |
"<pre id='line13' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line14\")'> 14: @cython.wraparound(False)</pre>\n", | |
"<pre id='line14' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line15\")'> 15: cdef inline double nan_euclidean(const double[::1] u, const double[::1] v, const Py_ssize_t n):</pre>\n", | |
"<pre id='line15' class='code' style='background-color: #FFFFff'>static CYTHON_INLINE double __pyx_f_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_euclidean(__Pyx_memviewslice const __pyx_v_u, __Pyx_memviewslice const __pyx_v_v, Py_ssize_t const __pyx_v_n) {\n", | |
" Py_ssize_t __pyx_v_c;\n", | |
" double __pyx_v_a;\n", | |
" double __pyx_v_b;\n", | |
" double __pyx_v_d;\n", | |
" double __pyx_v_asum;\n", | |
" double __pyx_r;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_euclidean\", 0);\n", | |
"/* \u2026 */\n", | |
" /* function exit code */\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line16\")'> 16: cdef Py_ssize_t c = 0</pre>\n", | |
"<pre id='line16' class='code' style='background-color: #FFFFff'> __pyx_v_c = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line17\")'> 17: cdef double a = 0.0</pre>\n", | |
"<pre id='line17' class='code' style='background-color: #FFFFff'> __pyx_v_a = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line18\")'> 18: cdef double b = 0.0</pre>\n", | |
"<pre id='line18' class='code' style='background-color: #FFFFff'> __pyx_v_b = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line19\")'> 19: cdef double d = 0.0</pre>\n", | |
"<pre id='line19' class='code' style='background-color: #FFFFff'> __pyx_v_d = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line20\")'> 20: cdef double asum = 0.0</pre>\n", | |
"<pre id='line20' class='code' style='background-color: #FFFFff'> __pyx_v_asum = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line21\")'> 21: for c in range(n):</pre>\n", | |
"<pre id='line21' class='code' style='background-color: #FFFFff'> __pyx_t_1 = __pyx_v_n;\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n", | |
" __pyx_v_c = __pyx_t_2;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line22\")'> 22: a = u[c]</pre>\n", | |
"<pre id='line22' class='code' style='background-color: #FFFFff'> __pyx_t_3 = __pyx_v_c;\n", | |
" __pyx_v_a = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_u.data) + __pyx_t_3)) )));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line23\")'> 23: if a != a:</pre>\n", | |
"<pre id='line23' class='code' style='background-color: #FFFFff'> __pyx_t_4 = ((__pyx_v_a != __pyx_v_a) != 0);\n", | |
" if (__pyx_t_4) {\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line24\")'> 24: continue</pre>\n", | |
"<pre id='line24' class='code' style='background-color: #FFFFff'> goto __pyx_L3_continue;\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line25\")'> 25: b = v[c]</pre>\n", | |
"<pre id='line25' class='code' style='background-color: #FFFFff'> __pyx_t_5 = __pyx_v_c;\n", | |
" __pyx_v_b = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_v.data) + __pyx_t_5)) )));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line26\")'> 26: if b != b:</pre>\n", | |
"<pre id='line26' class='code' style='background-color: #FFFFff'> __pyx_t_4 = ((__pyx_v_b != __pyx_v_b) != 0);\n", | |
" if (__pyx_t_4) {\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line27\")'> 27: continue</pre>\n", | |
"<pre id='line27' class='code' style='background-color: #FFFFff'> goto __pyx_L3_continue;\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line28\")'> 28: d = a - b</pre>\n", | |
"<pre id='line28' class='code' style='background-color: #FFFFff'> __pyx_v_d = (__pyx_v_a - __pyx_v_b);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line29\")'> 29: asum += d * d</pre>\n", | |
"<pre id='line29' class='code' style='background-color: #FFFFff'> __pyx_v_asum = (__pyx_v_asum + (__pyx_v_d * __pyx_v_d));\n", | |
" __pyx_L3_continue:;\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line30\")'> 30: return sqrt(asum)</pre>\n", | |
"<pre id='line30' class='code' style='background-color: #FFFFff'> __pyx_r = sqrt(__pyx_v_asum);\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line31\")'> 31: </pre>\n", | |
"<pre id='line31' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line32\")'> 32: @cython.boundscheck(False)</pre>\n", | |
"<pre id='line32' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line33\")'> 33: @cython.wraparound(False)</pre>\n", | |
"<pre id='line33' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line34\")'> 34: cdef inline double nan_euclidean2(const double[::1] u, const double[::1] v, const Py_ssize_t n):</pre>\n", | |
"<pre id='line34' class='code' style='background-color: #FFFFff'>static CYTHON_INLINE double __pyx_f_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_euclidean2(__Pyx_memviewslice const __pyx_v_u, __Pyx_memviewslice const __pyx_v_v, Py_ssize_t const __pyx_v_n) {\n", | |
" Py_ssize_t __pyx_v_c;\n", | |
" double __pyx_v_d;\n", | |
" double __pyx_v_a;\n", | |
" double __pyx_v_b;\n", | |
" double __pyx_v_asum;\n", | |
" double __pyx_r;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_euclidean2\", 0);\n", | |
"/* \u2026 */\n", | |
" /* function exit code */\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line35\")'> 35: cdef Py_ssize_t c = 0</pre>\n", | |
"<pre id='line35' class='code' style='background-color: #FFFFff'> __pyx_v_c = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line36\")'> 36: cdef double d = 0.0</pre>\n", | |
"<pre id='line36' class='code' style='background-color: #FFFFff'> __pyx_v_d = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line37\")'> 37: cdef double a = 0.0</pre>\n", | |
"<pre id='line37' class='code' style='background-color: #FFFFff'> __pyx_v_a = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line38\")'> 38: cdef double b = 0.0</pre>\n", | |
"<pre id='line38' class='code' style='background-color: #FFFFff'> __pyx_v_b = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line39\")'> 39: cdef double asum = 0.0</pre>\n", | |
"<pre id='line39' class='code' style='background-color: #FFFFff'> __pyx_v_asum = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line40\")'> 40: for c in range(n):</pre>\n", | |
"<pre id='line40' class='code' style='background-color: #FFFFff'> __pyx_t_1 = __pyx_v_n;\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n", | |
" __pyx_v_c = __pyx_t_2;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line41\")'> 41: a = u[c]</pre>\n", | |
"<pre id='line41' class='code' style='background-color: #FFFFff'> __pyx_t_3 = __pyx_v_c;\n", | |
" __pyx_v_a = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_u.data) + __pyx_t_3)) )));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line42\")'> 42: b = v[c]</pre>\n", | |
"<pre id='line42' class='code' style='background-color: #FFFFff'> __pyx_t_4 = __pyx_v_c;\n", | |
" __pyx_v_b = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_v.data) + __pyx_t_4)) )));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line43\")'> 43: if a == a and b == b:</pre>\n", | |
"<pre id='line43' class='code' style='background-color: #FFFFff'> __pyx_t_5 = ((__pyx_v_a == __pyx_v_a) != 0);\n", | |
" if (__pyx_t_5) {\n", | |
" __pyx_t_6 = ((__pyx_v_b == __pyx_v_b) != 0);\n", | |
" __pyx_t_7 = __pyx_t_6;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_t_5;\n", | |
" }\n", | |
" if (__pyx_t_7) {\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line44\")'> 44: d = a - b</pre>\n", | |
"<pre id='line44' class='code' style='background-color: #FFFFff'> __pyx_v_d = (__pyx_v_a - __pyx_v_b);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line45\")'> 45: asum += d * d</pre>\n", | |
"<pre id='line45' class='code' style='background-color: #FFFFff'> __pyx_v_asum = (__pyx_v_asum + (__pyx_v_d * __pyx_v_d));\n", | |
" goto __pyx_L5;\n", | |
" }\n", | |
" __pyx_L5:;\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line46\")'> 46: return sqrt(asum)</pre>\n", | |
"<pre id='line46' class='code' style='background-color: #FFFFff'> __pyx_r = sqrt(__pyx_v_asum);\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line47\")'> 47: </pre>\n", | |
"<pre id='line47' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line48\")'> 48: @cython.boundscheck(False)</pre>\n", | |
"<pre id='line48' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line49\")'> 49: @cython.wraparound(False)</pre>\n", | |
"<pre id='line49' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line50\")'> 50: def nan_pdist2(np.ndarray[np.float64_t, ndim=2] data):</pre>\n", | |
"<pre id='line50' class='code' style='background-color: #FFFF34'>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2(PyObject *__pyx_self, PyObject *__pyx_v_data); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2 = {<span class='pyx_macro_api'>__Pyx_NAMESTR</span>(\"nan_pdist2\"), (PyCFunction)__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2, METH_O, <span class='pyx_macro_api'>__Pyx_DOCSTR</span>(0)};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2(PyObject *__pyx_self, PyObject *__pyx_v_data) {\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_pdist2 (wrapper)\", 0);\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, \"data\", 0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_pdist2(__pyx_self, ((PyArrayObject *)__pyx_v_data));\n", | |
" CYTHON_UNUSED int __pyx_lineno = 0;\n", | |
" CYTHON_UNUSED const char *__pyx_filename = NULL;\n", | |
" CYTHON_UNUSED int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_pdist2(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_data) {\n", | |
" npy_intp *__pyx_v_dim;\n", | |
" Py_ssize_t __pyx_v_m;\n", | |
" Py_ssize_t __pyx_v_n;\n", | |
" Py_ssize_t __pyx_v_i;\n", | |
" Py_ssize_t __pyx_v_j;\n", | |
" Py_ssize_t __pyx_v_k;\n", | |
" __Pyx_memviewslice __pyx_v_first = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyArrayObject *__pyx_v_dm = 0;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_data;\n", | |
" __Pyx_Buffer __pyx_pybuffer_data;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_dm;\n", | |
" __Pyx_Buffer __pyx_pybuffer_dm;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_pdist2\", 0);\n", | |
" __pyx_pybuffer_dm.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_dm.refcount = 0;\n", | |
" __pyx_pybuffernd_dm.data = NULL;\n", | |
" __pyx_pybuffernd_dm.rcbuffer = &__pyx_pybuffer_dm;\n", | |
" __pyx_pybuffer_data.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_data.refcount = 0;\n", | |
" __pyx_pybuffernd_data.data = NULL;\n", | |
" __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_data, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[1];\n", | |
"/* \u2026 */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5.nan_pdist2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_first, 1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_dm);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"/* \u2026 */\n", | |
" __pyx_tuple__18 = <span class='py_c_api'>PyTuple_Pack</span>(9, __pyx_n_s_data, __pyx_n_s_dim, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_first, __pyx_n_s_dm);<span class='error_goto'> if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__18);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__18);\n", | |
"/* \u2026 */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2, NULL, __pyx_n_s_cython_magic_b9d0f7240e5ef6934f);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __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_nan_pdist2, __pyx_t_1) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__19 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(1, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_moritz_cache_ipython_cytho, __pyx_n_s_nan_pdist2, 50, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
"</pre><pre class='line' style='background-color: #FFFFe7' onclick='toggleDiv(\"line51\")'> 51: cdef np.npy_intp *dim = PyArray_DIMS(data)</pre>\n", | |
"<pre id='line51' class='code' style='background-color: #FFFFe7'> __pyx_v_dim = <span class='py_macro_api'>PyArray_DIMS</span>(((PyArrayObject *)__pyx_v_data));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line52\")'> 52: cdef Py_ssize_t m = dim[0]</pre>\n", | |
"<pre id='line52' class='code' style='background-color: #FFFFff'> __pyx_v_m = (__pyx_v_dim[0]);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line53\")'> 53: cdef Py_ssize_t n = dim[1]</pre>\n", | |
"<pre id='line53' class='code' style='background-color: #FFFFff'> __pyx_v_n = (__pyx_v_dim[1]);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line54\")'> 54: cdef Py_ssize_t i = 0</pre>\n", | |
"<pre id='line54' class='code' style='background-color: #FFFFff'> __pyx_v_i = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line55\")'> 55: cdef Py_ssize_t j = 0</pre>\n", | |
"<pre id='line55' class='code' style='background-color: #FFFFff'> __pyx_v_j = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line56\")'> 56: cdef Py_ssize_t k = 0</pre>\n", | |
"<pre id='line56' class='code' style='background-color: #FFFFff'> __pyx_v_k = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line57\")'> 57: cdef double[::1] first</pre>\n", | |
"<pre id='line57' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF31' onclick='toggleDiv(\"line58\")'> 58: cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)</pre>\n", | |
"<pre id='line58' class='code' style='background-color: #FFFF31'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_zeros);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyInt_FromSsize_t</span>(__Pyx_div_Py_ssize_t((__pyx_v_m * (__pyx_v_m - 1)), 2));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_float64);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_2, __pyx_t_3, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {\n", | |
" __pyx_v_dm = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf = NULL;\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" } else {__pyx_pybuffernd_dm.diminfo[0].strides = __pyx_pybuffernd_dm.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_dm.diminfo[0].shape = __pyx_pybuffernd_dm.rcbuffer->pybuffer.shape[0];\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_6 = 0;\n", | |
" __pyx_v_dm = ((PyArrayObject *)__pyx_t_5);\n", | |
" __pyx_t_5 = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line59\")'> 59: for i in range(m - 1):</pre>\n", | |
"<pre id='line59' class='code' style='background-color: #FFFFff'> __pyx_t_7 = (__pyx_v_m - 1);\n", | |
" for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {\n", | |
" __pyx_v_i = __pyx_t_8;\n", | |
"</pre><pre class='line' style='background-color: #FFFFaa' onclick='toggleDiv(\"line60\")'> 60: first = data[i]</pre>\n", | |
"<pre id='line60' class='code' style='background-color: #FFFFaa'> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(((PyObject *)__pyx_v_data), __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0);<span class='error_goto'> if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>;\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_9 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dc_double</span>(__pyx_t_5);\n", | |
" if (unlikely(!__pyx_t_9.memview)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_first, 1);\n", | |
" __pyx_v_first = __pyx_t_9;\n", | |
" __pyx_t_9.memview = NULL;\n", | |
" __pyx_t_9.data = NULL;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line61\")'> 61: for j in range(i + 1, m):</pre>\n", | |
"<pre id='line61' class='code' style='background-color: #FFFFff'> __pyx_t_10 = __pyx_v_m;\n", | |
" for (__pyx_t_11 = (__pyx_v_i + 1); __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {\n", | |
" __pyx_v_j = __pyx_t_11;\n", | |
"</pre><pre class='line' style='background-color: #FFFFaa' onclick='toggleDiv(\"line62\")'> 62: dm[k] = nan_euclidean2(first, data[j], n)</pre>\n", | |
"<pre id='line62' class='code' style='background-color: #FFFFaa'> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(((PyObject *)__pyx_v_data), __pyx_v_j, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0);<span class='error_goto'> if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>;\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_12 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dc_double</span>(__pyx_t_5);\n", | |
" if (unlikely(!__pyx_t_12.memview)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_t_13 = __pyx_v_k;\n", | |
" *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_dm.diminfo[0].strides) = __pyx_f_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_euclidean2(__pyx_v_first, __pyx_t_12, __pyx_v_n);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line63\")'> 63: k += 1</pre>\n", | |
"<pre id='line63' class='code' style='background-color: #FFFFff'> __pyx_v_k = (__pyx_v_k + 1);\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line64\")'> 64: return dm</pre>\n", | |
"<pre id='line64' class='code' style='background-color: #FFFFd4'> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_dm));\n", | |
" __pyx_r = ((PyObject *)__pyx_v_dm);\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line65\")'> 65: </pre>\n", | |
"<pre id='line65' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line66\")'> 66: @cython.boundscheck(False)</pre>\n", | |
"<pre id='line66' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line67\")'> 67: @cython.wraparound(False)</pre>\n", | |
"<pre id='line67' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line68\")'> 68: def nan_pdist3(np.ndarray[np.float64_t, ndim=2] data):</pre>\n", | |
"<pre id='line68' class='code' style='background-color: #FFFF34'>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3(PyObject *__pyx_self, PyObject *__pyx_v_data); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3 = {<span class='pyx_macro_api'>__Pyx_NAMESTR</span>(\"nan_pdist3\"), (PyCFunction)__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3, METH_O, <span class='pyx_macro_api'>__Pyx_DOCSTR</span>(0)};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3(PyObject *__pyx_self, PyObject *__pyx_v_data) {\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_pdist3 (wrapper)\", 0);\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, \"data\", 0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_2nan_pdist3(__pyx_self, ((PyArrayObject *)__pyx_v_data));\n", | |
" CYTHON_UNUSED int __pyx_lineno = 0;\n", | |
" CYTHON_UNUSED const char *__pyx_filename = NULL;\n", | |
" CYTHON_UNUSED int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_2nan_pdist3(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_data) {\n", | |
" npy_intp *__pyx_v_dim;\n", | |
" Py_ssize_t __pyx_v_m;\n", | |
" Py_ssize_t __pyx_v_n;\n", | |
" Py_ssize_t __pyx_v_i;\n", | |
" Py_ssize_t __pyx_v_j;\n", | |
" Py_ssize_t __pyx_v_c;\n", | |
" Py_ssize_t __pyx_v_k;\n", | |
" double __pyx_v_d;\n", | |
" __Pyx_memviewslice __pyx_v_column = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" __Pyx_memviewslice __pyx_v_cont = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyArrayObject *__pyx_v_dm = 0;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_data;\n", | |
" __Pyx_Buffer __pyx_pybuffer_data;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_dm;\n", | |
" __Pyx_Buffer __pyx_pybuffer_dm;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"nan_pdist3\", 0);\n", | |
" __pyx_pybuffer_dm.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_dm.refcount = 0;\n", | |
" __pyx_pybuffernd_dm.data = NULL;\n", | |
" __pyx_pybuffernd_dm.rcbuffer = &__pyx_pybuffer_dm;\n", | |
" __pyx_pybuffer_data.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_data.refcount = 0;\n", | |
" __pyx_pybuffernd_data.data = NULL;\n", | |
" __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_data, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[1];\n", | |
"/* \u2026 */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5.nan_pdist3\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_data.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_column, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_cont, 1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_dm);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"/* \u2026 */\n", | |
" __pyx_tuple__20 = <span class='py_c_api'>PyTuple_Pack</span>(12, __pyx_n_s_data, __pyx_n_s_dim, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_c, __pyx_n_s_k, __pyx_n_s_d, __pyx_n_s_column, __pyx_n_s_cont, __pyx_n_s_dm);<span class='error_goto'> if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__20);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__20);\n", | |
"/* \u2026 */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3, NULL, __pyx_n_s_cython_magic_b9d0f7240e5ef6934f);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __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_nan_pdist3, __pyx_t_1) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__21 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(1, 0, 12, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_moritz_cache_ipython_cytho, __pyx_n_s_nan_pdist3, 68, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
"</pre><pre class='line' style='background-color: #FFFFe7' onclick='toggleDiv(\"line69\")'> 69: cdef np.npy_intp *dim = PyArray_DIMS(data)</pre>\n", | |
"<pre id='line69' class='code' style='background-color: #FFFFe7'> __pyx_v_dim = <span class='py_macro_api'>PyArray_DIMS</span>(((PyArrayObject *)__pyx_v_data));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line70\")'> 70: cdef Py_ssize_t m = dim[0]</pre>\n", | |
"<pre id='line70' class='code' style='background-color: #FFFFff'> __pyx_v_m = (__pyx_v_dim[0]);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line71\")'> 71: cdef Py_ssize_t n = dim[1]</pre>\n", | |
"<pre id='line71' class='code' style='background-color: #FFFFff'> __pyx_v_n = (__pyx_v_dim[1]);\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line72\")'> 72: cdef Py_ssize_t i = 0</pre>\n", | |
"<pre id='line72' class='code' style='background-color: #FFFFff'> __pyx_v_i = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line73\")'> 73: cdef Py_ssize_t j = 0</pre>\n", | |
"<pre id='line73' class='code' style='background-color: #FFFFff'> __pyx_v_j = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line74\")'> 74: cdef Py_ssize_t c = 0</pre>\n", | |
"<pre id='line74' class='code' style='background-color: #FFFFff'> __pyx_v_c = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line75\")'> 75: cdef Py_ssize_t k = 0</pre>\n", | |
"<pre id='line75' class='code' style='background-color: #FFFFff'> __pyx_v_k = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line76\")'> 76: cdef double d = 0.0</pre>\n", | |
"<pre id='line76' class='code' style='background-color: #FFFFff'> __pyx_v_d = 0.0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line77\")'> 77: cdef double[:] column</pre>\n", | |
"<pre id='line77' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line78\")'> 78: cdef double[:, :] cont = data</pre>\n", | |
"<pre id='line78' class='code' style='background-color: #FFFFd4'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double</span>(((PyObject *)__pyx_v_data));\n", | |
" if (unlikely(!__pyx_t_1.memview)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_v_cont = __pyx_t_1;\n", | |
" __pyx_t_1.memview = NULL;\n", | |
" __pyx_t_1.data = NULL;\n", | |
"</pre><pre class='line' style='background-color: #FFFF31' onclick='toggleDiv(\"line79\")'> 79: cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)</pre>\n", | |
"<pre id='line79' class='code' style='background-color: #FFFF31'> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s_zeros);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" __pyx_t_2 = <span class='py_c_api'>PyInt_FromSsize_t</span>(__Pyx_div_Py_ssize_t((__pyx_v_m * (__pyx_v_m - 1)), 2));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_2);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n", | |
" __pyx_t_2 = 0;\n", | |
" __pyx_t_2 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s_float64);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_3, __pyx_t_4, __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" if (!(likely(((__pyx_t_6) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_dm.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {\n", | |
" __pyx_v_dm = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf = NULL;\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" } else {__pyx_pybuffernd_dm.diminfo[0].strides = __pyx_pybuffernd_dm.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_dm.diminfo[0].shape = __pyx_pybuffernd_dm.rcbuffer->pybuffer.shape[0];\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_7 = 0;\n", | |
" __pyx_v_dm = ((PyArrayObject *)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line80\")'> 80: for c in range(n):</pre>\n", | |
"<pre id='line80' class='code' style='background-color: #FFFFff'> __pyx_t_8 = __pyx_v_n;\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {\n", | |
" __pyx_v_c = __pyx_t_9;\n", | |
"</pre><pre class='line' style='background-color: #FFFFaa' onclick='toggleDiv(\"line81\")'> 81: column = cont[:, c]</pre>\n", | |
"<pre id='line81' class='code' style='background-color: #FFFFaa'> __pyx_t_11 = -1;\n", | |
" __pyx_t_10.data = __pyx_v_cont.data;\n", | |
" __pyx_t_10.memview = __pyx_v_cont.memview;\n", | |
" __PYX_INC_MEMVIEW(&__pyx_t_10, 0);\n", | |
" __pyx_t_10.shape[0] = __pyx_v_cont.shape[0];\n", | |
"__pyx_t_10.strides[0] = __pyx_v_cont.strides[0];\n", | |
" __pyx_t_10.suboffsets[0] = -1;\n", | |
"\n", | |
"{\n", | |
" Py_ssize_t __pyx_tmp_idx = __pyx_v_c;\n", | |
" Py_ssize_t __pyx_tmp_shape = __pyx_v_cont.shape[1];\n", | |
" Py_ssize_t __pyx_tmp_stride = __pyx_v_cont.strides[1];\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 1)\");\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;\n", | |
"}\n", | |
"\n", | |
"__PYX_XDEC_MEMVIEW(&__pyx_v_column, 1);\n", | |
" __pyx_v_column = __pyx_t_10;\n", | |
" __pyx_t_10.memview = NULL;\n", | |
" __pyx_t_10.data = NULL;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line82\")'> 82: k = 0</pre>\n", | |
"<pre id='line82' class='code' style='background-color: #FFFFff'> __pyx_v_k = 0;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line83\")'> 83: for i in range(m - 1):</pre>\n", | |
"<pre id='line83' class='code' style='background-color: #FFFFff'> __pyx_t_12 = (__pyx_v_m - 1);\n", | |
" for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {\n", | |
" __pyx_v_i = __pyx_t_13;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line84\")'> 84: if column[i] != column[i]:</pre>\n", | |
"<pre id='line84' class='code' style='background-color: #FFFFff'> __pyx_t_14 = __pyx_v_i;\n", | |
" __pyx_t_15 = __pyx_v_i;\n", | |
" __pyx_t_16 = (((*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_14 * __pyx_v_column.strides[0]) ))) != (*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_15 * __pyx_v_column.strides[0]) )))) != 0);\n", | |
" if (__pyx_t_16) {\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line85\")'> 85: k += m - i - 1</pre>\n", | |
"<pre id='line85' class='code' style='background-color: #FFFFff'> __pyx_v_k = (__pyx_v_k + ((__pyx_v_m - __pyx_v_i) - 1));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line86\")'> 86: continue</pre>\n", | |
"<pre id='line86' class='code' style='background-color: #FFFFff'> goto __pyx_L5_continue;\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line87\")'> 87: for j in range(i + 1, m):</pre>\n", | |
"<pre id='line87' class='code' style='background-color: #FFFFff'> __pyx_t_17 = __pyx_v_m;\n", | |
" for (__pyx_t_18 = (__pyx_v_i + 1); __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) {\n", | |
" __pyx_v_j = __pyx_t_18;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line88\")'> 88: if column[j] == column[j]:</pre>\n", | |
"<pre id='line88' class='code' style='background-color: #FFFFff'> __pyx_t_19 = __pyx_v_j;\n", | |
" __pyx_t_20 = __pyx_v_j;\n", | |
" __pyx_t_16 = (((*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_19 * __pyx_v_column.strides[0]) ))) == (*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_20 * __pyx_v_column.strides[0]) )))) != 0);\n", | |
" if (__pyx_t_16) {\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line89\")'> 89: d = column[i] - column[j]</pre>\n", | |
"<pre id='line89' class='code' style='background-color: #FFFFff'> __pyx_t_21 = __pyx_v_i;\n", | |
" __pyx_t_22 = __pyx_v_j;\n", | |
" __pyx_v_d = ((*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_21 * __pyx_v_column.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_column.data + __pyx_t_22 * __pyx_v_column.strides[0]) ))));\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line90\")'> 90: dm[k] += d * d</pre>\n", | |
"<pre id='line90' class='code' style='background-color: #FFFFff'> __pyx_t_23 = __pyx_v_k;\n", | |
" *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf, __pyx_t_23, __pyx_pybuffernd_dm.diminfo[0].strides) += (__pyx_v_d * __pyx_v_d);\n", | |
" goto __pyx_L10;\n", | |
" }\n", | |
" __pyx_L10:;\n", | |
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line91\")'> 91: k += 1</pre>\n", | |
"<pre id='line91' class='code' style='background-color: #FFFFff'> __pyx_v_k = (__pyx_v_k + 1);\n", | |
" }\n", | |
" __pyx_L5_continue:;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class='line' style='background-color: #FFFF5e' onclick='toggleDiv(\"line92\")'> 92: return np.sqrt(dm)</pre>\n", | |
"<pre id='line92' class='code' style='background-color: #FFFF5e'> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_sqrt);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_dm));\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, ((PyObject *)__pyx_v_dm));\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(((PyObject *)__pyx_v_dm));\n", | |
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_2, __pyx_t_6, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_r = __pyx_t_4;\n", | |
" __pyx_t_4 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre></body></html>" | |
], | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 4, | |
"text": [ | |
"<IPython.core.display.HTML at 0x2533790>" | |
] | |
} | |
], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.random.seed(123456789)\n", | |
"arr = np.random.rand(300, 3000)\n", | |
"f_arr = np.asfortranarray(arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(pdist(arr), nan_pdist(arr))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 6, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(pdist(arr), nan_pdist2(arr))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 7, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(pdist(arr), nan_pdist3(arr))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 8, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(pdist(arr), nan_pdist3(f_arr))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 9, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"arr_10 = arr.copy()\n", | |
"arr_10[arr < 0.1] = np.nan\n", | |
"f_arr_10 = np.asfortranarray(arr_10)\n", | |
"arr_30 = arr.copy()\n", | |
"arr_30[arr < 0.3] = np.nan\n", | |
"f_arr_30 = np.asfortranarray(arr_30)\n", | |
"arr_50 = arr.copy()\n", | |
"arr_50[arr < 0.5] = np.nan\n", | |
"f_arr_50 = np.asfortranarray(arr_50)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 10 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 pdist(arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 117 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 11 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit nan_pdist(arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"1 loops, best of 3: 1.44 s per loop\n" | |
] | |
} | |
], | |
"prompt_number": 12 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist2(arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 225 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 13 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 215 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 14 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(f_arr)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 184 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 15 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(nan_pdist2(arr_10), nan_pdist3(arr_10))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 16, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 16 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist2(arr_10)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 415 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 17 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(arr_10)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 216 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 18 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(f_arr_10)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 196 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 19 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(nan_pdist2(arr_30), nan_pdist3(arr_30))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 20, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 20 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist2(arr_30)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 689 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 21 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(arr_30)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 173 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 22 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(f_arr_30)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 160 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 23 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"np.allclose(nan_pdist2(arr_50), nan_pdist3(arr_50))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 24, | |
"text": [ | |
"True" | |
] | |
} | |
], | |
"prompt_number": 24 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist2(arr_50)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 813 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 25 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(arr_50)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 127 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 26 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%timeit -n 10 -r 10 nan_pdist3(f_arr_50)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"10 loops, best of 10: 119 ms per loop\n" | |
] | |
} | |
], | |
"prompt_number": 27 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment