相关疑难解决方法(0)

python中最快的成对距离度量

我有一维数字,想要计算所有成对的欧氏距离.我有一个方法(感谢SO)用广播这样做,但它效率低,因为它计算每个距离两次.并且它不能很好地扩展.

这是一个例子,通过1000个数字的数组给出了我想要的东西.

import numpy as np
import random
r = np.array([random.randrange(1, 1000) for _ in range(0, 1000)])
dists = np.abs(r - r[:, None])
Run Code Online (Sandbox Code Playgroud)

什么是scipy/numpy/scikit中最快的实现 - 我可以用来做这个,因为它必须扩展到1D数组具有> 10k值的情况.

注意:矩阵是对称的,所以我猜测通过解决它可以获得至少2倍的加速,我只是不知道如何.

python arrays numpy scipy scikit-learn

13
推荐指数
3
解决办法
2万
查看次数

cython中的cython共享内存.parallel.prange - block

我有一个函数foo,它将一个指向内存的指针作为参数,并且对该内存进行写入和读取:

cdef void foo (double *data):
   data[some_index_int] = some_value_double
   do_something_dependent_on (data)
Run Code Online (Sandbox Code Playgroud)

data这样分配:

cdef int N = some_int
cdef double *data = <double*> malloc (N * sizeof (double))

cdef int i
for i in cython.parallel.prange (N, nogil=True):
    foo (data)

readout (data)
Run Code Online (Sandbox Code Playgroud)

我现在的问题是:不同的线程如何对待这个?我的猜测是指向的内存data将由所有线程共享,并在函数内部"同时"读取或写入foo.这会弄乱所有结果,因为人们不能依赖先前设定的数据值(内部foo)?我的猜测是正确的还是在cython编译器中实现了一些神奇的安全带?

非常感谢你提前.

python malloc parallel-processing cython python-multithreading

11
推荐指数
2
解决办法
3091
查看次数

计算python中每个点之间距离的最快方法

在我的项目中,我需要计算存储在数组中的每个点之间的欧几里德距离.入口数组是2D numpy数组,其中3列是坐标(x,y,z),每行定义一个新点.

我通常在我的测试用例中使用5000 - 6000点.

我的第一个算法使用Cython和我的第二个numpy.我发现我的numpy算法比cython快.

编辑:6000分:

numpy 1.76 s/cython 4.36 s

这是我的cython代码:

cimport cython
from libc.math cimport sqrt
@cython.boundscheck(False)
@cython.wraparound(False)
cdef void calcul1(double[::1] M,double[::1] R):

  cdef int i=0
  cdef int max = M.shape[0]
  cdef int x,y
  cdef int start = 1

  for x in range(0,max,3):
     for y in range(start,max,3):

        R[i]= sqrt((M[y] - M[x])**2 + (M[y+1] - M[x+1])**2 + (M[y+2] - M[x+2])**2)
        i+=1  

     start += 1
Run Code Online (Sandbox Code Playgroud)

M是初始条目数组的内存视图,但是flatten()在调用函数之前通过numpy calcul1(),R是用于存储所有结果的1D输出数组的存储器视图.

这是我的Numpy代码:

def calcul2(M):

     return np.sqrt(((M[:,:,np.newaxis] - M[:,np.newaxis,:])**2).sum(axis=0))
Run Code Online (Sandbox Code Playgroud)

这里M是初始入口数组,但是transpose() …

python optimization numpy cython

5
推荐指数
1
解决办法
1504
查看次数