Skip to content

Instantly share code, notes, and snippets.

@Midnighter
Created July 24, 2014 10:03
Show Gist options
  • Save Midnighter/b81d5732a0ef88f2e185 to your computer and use it in GitHub Desktop.
Save Midnighter/b81d5732a0ef88f2e185 to your computer and use it in GitHub Desktop.
pairwise euclidean distance with missing values
Display the source blob
Display the rendered blob
Raw
{
"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) &lt; 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) &lt; 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 &lt; __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 &lt; __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 = &amp;__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 = &amp;__pyx_pybuffer_data;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_v_data, &amp;__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-&gt;pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer-&gt;pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer-&gt;pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer-&gt;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(&amp;__pyx_t_9, 1);\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_t_12, 1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&amp;__pyx_type, &amp;__pyx_value, &amp;__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;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>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;pybuffer);\n",
" __pyx_L2:;\n",
" __PYX_XDEC_MEMVIEW(&amp;__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(&amp;__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) &lt; 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) &lt; 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>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_6, &amp;__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-&gt;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-&gt;pybuffer.strides[0]; __pyx_pybuffernd_dm.diminfo[0].shape = __pyx_pybuffernd_dm.rcbuffer-&gt;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 &lt; __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(&amp;__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 &lt; __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-&gt;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(&amp;__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 = &amp;__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 = &amp;__pyx_pybuffer_data;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_v_data, &amp;__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-&gt;pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer-&gt;pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer-&gt;pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer-&gt;pybuffer.shape[1];\n",
"/* \u2026 */\n",
" /* function exit code */\n",
" __pyx_L1_error:;\n",
" __PYX_XDEC_MEMVIEW(&amp;__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(&amp;__pyx_t_10, 1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&amp;__pyx_type, &amp;__pyx_value, &amp;__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;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>(&amp;__pyx_pybuffernd_data.rcbuffer-&gt;pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;pybuffer);\n",
" __pyx_L2:;\n",
" __PYX_XDEC_MEMVIEW(&amp;__pyx_v_column, 1);\n",
" __PYX_XDEC_MEMVIEW(&amp;__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(&amp;__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) &lt; 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) &lt; 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>(&amp;__pyx_pybuffernd_dm.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_7, &amp;__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-&gt;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-&gt;pybuffer.strides[0]; __pyx_pybuffernd_dm.diminfo[0].shape = __pyx_pybuffernd_dm.rcbuffer-&gt;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 &lt; __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(&amp;__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 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
" __pyx_tmp_idx += __pyx_tmp_shape;\n",
" if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 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(&amp;__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 &lt; __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 &lt; __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-&gt;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