import numpy as np
import distance
from numpy.linalg import norm
from scipy.spatial.distance import pdist
def nan_pdist(data):
m = data.shape[0]
dm = np.zeros(m * (m - 1) // 2, dtype=float)
mask = np.isfinite(data)
vec_mask = np.zeros(data.shape[1], dtype=bool)
k = 0
for i in range(m - 1):
for j in range(i + 1, m):
vec_mask = np.logical_and(mask[i], mask[j])
dm[k] = norm(data[i][vec_mask] - data[j][vec_mask])
k += 1
return dm
%load_ext cythonmagic
%%cython -a -lm
cimport cython
import numpy as np
cimport numpy as np
from libc.math cimport sqrt
from numpy cimport (PyArray_DIMS,)
np.import_array()
@cython.boundscheck(False)
@cython.wraparound(False)
cdef inline double nan_euclidean(const double[::1] u, const double[::1] v, const Py_ssize_t n):
cdef Py_ssize_t c = 0
cdef double a = 0.0
cdef double b = 0.0
cdef double d = 0.0
cdef double asum = 0.0
for c in range(n):
a = u[c]
if a != a:
continue
b = v[c]
if b != b:
continue
d = a - b
asum += d * d
return sqrt(asum)
@cython.boundscheck(False)
@cython.wraparound(False)
cdef inline double nan_euclidean2(const double[::1] u, const double[::1] v, const Py_ssize_t n):
cdef Py_ssize_t c = 0
cdef double d = 0.0
cdef double a = 0.0
cdef double b = 0.0
cdef double asum = 0.0
for c in range(n):
a = u[c]
b = v[c]
if a == a and b == b:
d = a - b
asum += d * d
return sqrt(asum)
@cython.boundscheck(False)
@cython.wraparound(False)
def nan_pdist2(np.ndarray[np.float64_t, ndim=2] data):
cdef np.npy_intp *dim = PyArray_DIMS(data)
cdef Py_ssize_t m = dim[0]
cdef Py_ssize_t n = dim[1]
cdef Py_ssize_t i = 0
cdef Py_ssize_t j = 0
cdef Py_ssize_t k = 0
cdef double[::1] first
cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)
for i in range(m - 1):
first = data[i]
for j in range(i + 1, m):
dm[k] = nan_euclidean2(first, data[j], n)
k += 1
return dm
@cython.boundscheck(False)
@cython.wraparound(False)
def nan_pdist3(np.ndarray[np.float64_t, ndim=2] data):
cdef np.npy_intp *dim = PyArray_DIMS(data)
cdef Py_ssize_t m = dim[0]
cdef Py_ssize_t n = dim[1]
cdef Py_ssize_t i = 0
cdef Py_ssize_t j = 0
cdef Py_ssize_t c = 0
cdef Py_ssize_t k = 0
cdef double d = 0.0
cdef double[:] column
cdef double[:, :] cont = data
cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)
for c in range(n):
column = cont[:, c]
k = 0
for i in range(m - 1):
if column[i] != column[i]:
k += m - i - 1
continue
for j in range(i + 1, m):
if column[j] == column[j]:
d = column[i] - column[j]
dm[k] += d * d
k += 1
return np.sqrt(dm)
Generated by Cython 0.20.2 on Thu Jul 24 11:42:21 2014
1:
2: cimport cython
__pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
3: import numpy as np
__pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
4: cimport numpy as np
5:
6: from libc.math cimport sqrt
7: from numpy cimport (PyArray_DIMS,)
8:
9:
10: np.import_array()
import_array();
11:
12:
13: @cython.boundscheck(False)
14: @cython.wraparound(False)
15: cdef inline double nan_euclidean(const double[::1] u, const double[::1] v, const Py_ssize_t n):
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) { Py_ssize_t __pyx_v_c; double __pyx_v_a; double __pyx_v_b; double __pyx_v_d; double __pyx_v_asum; double __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_euclidean", 0); /* … */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
16: cdef Py_ssize_t c = 0
__pyx_v_c = 0;
17: cdef double a = 0.0
__pyx_v_a = 0.0;
18: cdef double b = 0.0
__pyx_v_b = 0.0;
19: cdef double d = 0.0
__pyx_v_d = 0.0;
20: cdef double asum = 0.0
__pyx_v_asum = 0.0;
21: for c in range(n):
__pyx_t_1 = __pyx_v_n; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_c = __pyx_t_2;
22: a = u[c]
__pyx_t_3 = __pyx_v_c; __pyx_v_a = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_u.data) + __pyx_t_3)) )));
23: if a != a:
__pyx_t_4 = ((__pyx_v_a != __pyx_v_a) != 0); if (__pyx_t_4) {
24: continue
goto __pyx_L3_continue; }
25: b = v[c]
__pyx_t_5 = __pyx_v_c; __pyx_v_b = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_v.data) + __pyx_t_5)) )));
26: if b != b:
__pyx_t_4 = ((__pyx_v_b != __pyx_v_b) != 0); if (__pyx_t_4) {
27: continue
goto __pyx_L3_continue; }
28: d = a - b
__pyx_v_d = (__pyx_v_a - __pyx_v_b);
29: asum += d * d
__pyx_v_asum = (__pyx_v_asum + (__pyx_v_d * __pyx_v_d)); __pyx_L3_continue:; }
30: return sqrt(asum)
__pyx_r = sqrt(__pyx_v_asum); goto __pyx_L0;
31:
32: @cython.boundscheck(False)
33: @cython.wraparound(False)
34: cdef inline double nan_euclidean2(const double[::1] u, const double[::1] v, const Py_ssize_t n):
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) { Py_ssize_t __pyx_v_c; double __pyx_v_d; double __pyx_v_a; double __pyx_v_b; double __pyx_v_asum; double __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_euclidean2", 0); /* … */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
35: cdef Py_ssize_t c = 0
__pyx_v_c = 0;
36: cdef double d = 0.0
__pyx_v_d = 0.0;
37: cdef double a = 0.0
__pyx_v_a = 0.0;
38: cdef double b = 0.0
__pyx_v_b = 0.0;
39: cdef double asum = 0.0
__pyx_v_asum = 0.0;
40: for c in range(n):
__pyx_t_1 = __pyx_v_n; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_c = __pyx_t_2;
41: a = u[c]
__pyx_t_3 = __pyx_v_c; __pyx_v_a = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_u.data) + __pyx_t_3)) )));
42: b = v[c]
__pyx_t_4 = __pyx_v_c; __pyx_v_b = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_v.data) + __pyx_t_4)) )));
43: if a == a and b == b:
__pyx_t_5 = ((__pyx_v_a == __pyx_v_a) != 0); if (__pyx_t_5) { __pyx_t_6 = ((__pyx_v_b == __pyx_v_b) != 0); __pyx_t_7 = __pyx_t_6; } else { __pyx_t_7 = __pyx_t_5; } if (__pyx_t_7) {
44: d = a - b
__pyx_v_d = (__pyx_v_a - __pyx_v_b);
45: asum += d * d
__pyx_v_asum = (__pyx_v_asum + (__pyx_v_d * __pyx_v_d)); goto __pyx_L5; } __pyx_L5:; }
46: return sqrt(asum)
__pyx_r = sqrt(__pyx_v_asum); goto __pyx_L0;
47:
48: @cython.boundscheck(False)
49: @cython.wraparound(False)
50: def nan_pdist2(np.ndarray[np.float64_t, ndim=2] data):
/* Python wrapper */ static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2(PyObject *__pyx_self, PyObject *__pyx_v_data); /*proto*/ static PyMethodDef __pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2 = {__Pyx_NAMESTR("nan_pdist2"), (PyCFunction)__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2, METH_O, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2(PyObject *__pyx_self, PyObject *__pyx_v_data) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_pdist2 (wrapper)", 0); if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, "data", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_pdist2(__pyx_self, ((PyArrayObject *)__pyx_v_data)); CYTHON_UNUSED int __pyx_lineno = 0; CYTHON_UNUSED const char *__pyx_filename = NULL; CYTHON_UNUSED int __pyx_clineno = 0; /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_nan_pdist2(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_data) { npy_intp *__pyx_v_dim; Py_ssize_t __pyx_v_m; Py_ssize_t __pyx_v_n; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; __Pyx_memviewslice __pyx_v_first = { 0, 0, { 0 }, { 0 }, { 0 } }; PyArrayObject *__pyx_v_dm = 0; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; __Pyx_LocalBuf_ND __pyx_pybuffernd_dm; __Pyx_Buffer __pyx_pybuffer_dm; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_pdist2", 0); __pyx_pybuffer_dm.pybuffer.buf = NULL; __pyx_pybuffer_dm.refcount = 0; __pyx_pybuffernd_dm.data = NULL; __pyx_pybuffernd_dm.rcbuffer = &__pyx_pybuffer_dm; __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__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)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __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]; /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dm.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5.nan_pdist2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dm.rcbuffer->pybuffer); __pyx_L2:; __PYX_XDEC_MEMVIEW(&__pyx_v_first, 1); __Pyx_XDECREF((PyObject *)__pyx_v_dm); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__18 = PyTuple_Pack(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); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); /* … */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_1nan_pdist2, NULL, __pyx_n_s_cython_magic_b9d0f7240e5ef6934f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_nan_pdist2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(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); if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
51: cdef np.npy_intp *dim = PyArray_DIMS(data)
__pyx_v_dim = PyArray_DIMS(((PyArrayObject *)__pyx_v_data));
52: cdef Py_ssize_t m = dim[0]
__pyx_v_m = (__pyx_v_dim[0]);
53: cdef Py_ssize_t n = dim[1]
__pyx_v_n = (__pyx_v_dim[1]);
54: cdef Py_ssize_t i = 0
__pyx_v_i = 0;
55: cdef Py_ssize_t j = 0
__pyx_v_j = 0;
56: cdef Py_ssize_t k = 0
__pyx_v_k = 0;
57: cdef double[::1] first
58: cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)
__pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyInt_FromSsize_t(__Pyx_div_Py_ssize_t((__pyx_v_m * (__pyx_v_m - 1)), 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float64); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__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)) { __pyx_v_dm = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf = NULL; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } 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]; } } __pyx_t_6 = 0; __pyx_v_dm = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0;
59: for i in range(m - 1):
__pyx_t_7 = (__pyx_v_m - 1); for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { __pyx_v_i = __pyx_t_8;
60: first = data[i]
__pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_v_data), __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_5); if (unlikely(!__pyx_t_9.memview)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __PYX_XDEC_MEMVIEW(&__pyx_v_first, 1); __pyx_v_first = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
61: for j in range(i + 1, m):
__pyx_t_10 = __pyx_v_m; for (__pyx_t_11 = (__pyx_v_i + 1); __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { __pyx_v_j = __pyx_t_11;
62: dm[k] = nan_euclidean2(first, data[j], n)
__pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_v_data), __pyx_v_j, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_5); if (unlikely(!__pyx_t_12.memview)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_13 = __pyx_v_k; *__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); __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
63: k += 1
__pyx_v_k = (__pyx_v_k + 1); } }
64: return dm
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_dm)); __pyx_r = ((PyObject *)__pyx_v_dm); goto __pyx_L0;
65:
66: @cython.boundscheck(False)
67: @cython.wraparound(False)
68: def nan_pdist3(np.ndarray[np.float64_t, ndim=2] data):
/* Python wrapper */ static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3(PyObject *__pyx_self, PyObject *__pyx_v_data); /*proto*/ static PyMethodDef __pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3 = {__Pyx_NAMESTR("nan_pdist3"), (PyCFunction)__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3, METH_O, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3(PyObject *__pyx_self, PyObject *__pyx_v_data) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_pdist3 (wrapper)", 0); if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, "data", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_2nan_pdist3(__pyx_self, ((PyArrayObject *)__pyx_v_data)); CYTHON_UNUSED int __pyx_lineno = 0; CYTHON_UNUSED const char *__pyx_filename = NULL; CYTHON_UNUSED int __pyx_clineno = 0; /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_2nan_pdist3(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_data) { npy_intp *__pyx_v_dim; Py_ssize_t __pyx_v_m; Py_ssize_t __pyx_v_n; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_c; Py_ssize_t __pyx_v_k; double __pyx_v_d; __Pyx_memviewslice __pyx_v_column = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_cont = { 0, 0, { 0 }, { 0 }, { 0 } }; PyArrayObject *__pyx_v_dm = 0; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; __Pyx_LocalBuf_ND __pyx_pybuffernd_dm; __Pyx_Buffer __pyx_pybuffer_dm; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("nan_pdist3", 0); __pyx_pybuffer_dm.pybuffer.buf = NULL; __pyx_pybuffer_dm.refcount = 0; __pyx_pybuffernd_dm.data = NULL; __pyx_pybuffernd_dm.rcbuffer = &__pyx_pybuffer_dm; __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__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)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __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]; /* … */ /* function exit code */ __pyx_L1_error:; __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dm.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5.nan_pdist3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dm.rcbuffer->pybuffer); __pyx_L2:; __PYX_XDEC_MEMVIEW(&__pyx_v_column, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_cont, 1); __Pyx_XDECREF((PyObject *)__pyx_v_dm); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__20 = PyTuple_Pack(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); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); /* … */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_b9d0f7240e5ef6934fa99b1b891215b5_3nan_pdist3, NULL, __pyx_n_s_cython_magic_b9d0f7240e5ef6934f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_nan_pdist3, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(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); if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
69: cdef np.npy_intp *dim = PyArray_DIMS(data)
__pyx_v_dim = PyArray_DIMS(((PyArrayObject *)__pyx_v_data));
70: cdef Py_ssize_t m = dim[0]
__pyx_v_m = (__pyx_v_dim[0]);
71: cdef Py_ssize_t n = dim[1]
__pyx_v_n = (__pyx_v_dim[1]);
72: cdef Py_ssize_t i = 0
__pyx_v_i = 0;
73: cdef Py_ssize_t j = 0
__pyx_v_j = 0;
74: cdef Py_ssize_t c = 0
__pyx_v_c = 0;
75: cdef Py_ssize_t k = 0
__pyx_v_k = 0;
76: cdef double d = 0.0
__pyx_v_d = 0.0;
77: cdef double[:] column
78: cdef double[:, :] cont = data
__pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(((PyObject *)__pyx_v_data)); if (unlikely(!__pyx_t_1.memview)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cont = __pyx_t_1; __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL;
79: cdef np.ndarray[np.float64_t, ndim=1] dm = np.zeros(m * (m - 1) // 2, dtype=np.float64)
__pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyInt_FromSsize_t(__Pyx_div_Py_ssize_t((__pyx_v_m * (__pyx_v_m - 1)), 2)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_6); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__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)) { __pyx_v_dm = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_dm.rcbuffer->pybuffer.buf = NULL; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } 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]; } } __pyx_t_7 = 0; __pyx_v_dm = ((PyArrayObject *)__pyx_t_6); __pyx_t_6 = 0;
80: for c in range(n):
__pyx_t_8 = __pyx_v_n; for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { __pyx_v_c = __pyx_t_9;
81: column = cont[:, c]
__pyx_t_11 = -1; __pyx_t_10.data = __pyx_v_cont.data; __pyx_t_10.memview = __pyx_v_cont.memview; __PYX_INC_MEMVIEW(&__pyx_t_10, 0); __pyx_t_10.shape[0] = __pyx_v_cont.shape[0]; __pyx_t_10.strides[0] = __pyx_v_cont.strides[0]; __pyx_t_10.suboffsets[0] = -1; { Py_ssize_t __pyx_tmp_idx = __pyx_v_c; Py_ssize_t __pyx_tmp_shape = __pyx_v_cont.shape[1]; Py_ssize_t __pyx_tmp_stride = __pyx_v_cont.strides[1]; if (0 && (__pyx_tmp_idx < 0)) __pyx_tmp_idx += __pyx_tmp_shape; if (0 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 1)"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride; } __PYX_XDEC_MEMVIEW(&__pyx_v_column, 1); __pyx_v_column = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
82: k = 0
__pyx_v_k = 0;
83: for i in range(m - 1):
__pyx_t_12 = (__pyx_v_m - 1); for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { __pyx_v_i = __pyx_t_13;
84: if column[i] != column[i]:
__pyx_t_14 = __pyx_v_i; __pyx_t_15 = __pyx_v_i; __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); if (__pyx_t_16) {
85: k += m - i - 1
__pyx_v_k = (__pyx_v_k + ((__pyx_v_m - __pyx_v_i) - 1));
86: continue
goto __pyx_L5_continue; }
87: for j in range(i + 1, m):
__pyx_t_17 = __pyx_v_m; for (__pyx_t_18 = (__pyx_v_i + 1); __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { __pyx_v_j = __pyx_t_18;
88: if column[j] == column[j]:
__pyx_t_19 = __pyx_v_j; __pyx_t_20 = __pyx_v_j; __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); if (__pyx_t_16) {
89: d = column[i] - column[j]
__pyx_t_21 = __pyx_v_i; __pyx_t_22 = __pyx_v_j; __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]) ))));
90: dm[k] += d * d
__pyx_t_23 = __pyx_v_k; *__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); goto __pyx_L10; } __pyx_L10:;
91: k += 1
__pyx_v_k = (__pyx_v_k + 1); } __pyx_L5_continue:; } }
92: return np.sqrt(dm)
__Pyx_XDECREF(__pyx_r); __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_INCREF(((PyObject *)__pyx_v_dm)); PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_dm)); __Pyx_GIVEREF(((PyObject *)__pyx_v_dm)); __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0;
np.random.seed(123456789)
arr = np.random.rand(300, 3000)
f_arr = np.asfortranarray(arr)
np.allclose(pdist(arr), nan_pdist(arr))
True
np.allclose(pdist(arr), nan_pdist2(arr))
True
np.allclose(pdist(arr), nan_pdist3(arr))
True
np.allclose(pdist(arr), nan_pdist3(f_arr))
True
arr_10 = arr.copy()
arr_10[arr < 0.1] = np.nan
f_arr_10 = np.asfortranarray(arr_10)
arr_30 = arr.copy()
arr_30[arr < 0.3] = np.nan
f_arr_30 = np.asfortranarray(arr_30)
arr_50 = arr.copy()
arr_50[arr < 0.5] = np.nan
f_arr_50 = np.asfortranarray(arr_50)
%timeit -n 10 -r 10 pdist(arr)
10 loops, best of 10: 117 ms per loop
%timeit nan_pdist(arr)
1 loops, best of 3: 1.44 s per loop
%timeit -n 10 -r 10 nan_pdist2(arr)
10 loops, best of 10: 225 ms per loop
%timeit -n 10 -r 10 nan_pdist3(arr)
10 loops, best of 10: 215 ms per loop
%timeit -n 10 -r 10 nan_pdist3(f_arr)
10 loops, best of 10: 184 ms per loop
np.allclose(nan_pdist2(arr_10), nan_pdist3(arr_10))
True
%timeit -n 10 -r 10 nan_pdist2(arr_10)
10 loops, best of 10: 415 ms per loop
%timeit -n 10 -r 10 nan_pdist3(arr_10)
10 loops, best of 10: 216 ms per loop
%timeit -n 10 -r 10 nan_pdist3(f_arr_10)
10 loops, best of 10: 196 ms per loop
np.allclose(nan_pdist2(arr_30), nan_pdist3(arr_30))
True
%timeit -n 10 -r 10 nan_pdist2(arr_30)
10 loops, best of 10: 689 ms per loop
%timeit -n 10 -r 10 nan_pdist3(arr_30)
10 loops, best of 10: 173 ms per loop
%timeit -n 10 -r 10 nan_pdist3(f_arr_30)
10 loops, best of 10: 160 ms per loop
np.allclose(nan_pdist2(arr_50), nan_pdist3(arr_50))
True
%timeit -n 10 -r 10 nan_pdist2(arr_50)
10 loops, best of 10: 813 ms per loop
%timeit -n 10 -r 10 nan_pdist3(arr_50)
10 loops, best of 10: 127 ms per loop
%timeit -n 10 -r 10 nan_pdist3(f_arr_50)
10 loops, best of 10: 119 ms per loop