用Cython优化Python-Scipy操作

用Cython优化Python-Scipy操作,python,scipy,cython,memoryview,Python,Scipy,Cython,Memoryview,Hi我想计算3D相关矩阵(r)值的p值,并计算完整p矩阵的FDR阈值(FDR仅基于上三角p值计算)。3D矩阵是巨大的(208、3544、3544)。目前,我使用这些cython函数来实现这一点。然而,我想让它更快,如果可能的话,让它使用更少的内存。你能帮忙吗 import numpy cimport numpy from scipy.special import stdtr DTYPE = numpy.float32 ctypedef numpy.float32_t DTYPE_t def

Hi我想计算3D相关矩阵(r)值的p值,并计算完整p矩阵的FDR阈值(FDR仅基于上三角p值计算)。3D矩阵是巨大的(208、3544、3544)。目前,我使用这些cython函数来实现这一点。然而,我想让它更快,如果可能的话,让它使用更少的内存。你能帮忙吗

import numpy
cimport numpy
from scipy.special import stdtr 
DTYPE = numpy.float32
ctypedef numpy.float32_t DTYPE_t

def get_p_matrix_from_r_matrix_3D(DTYPE_t[:,:,::1] r_matrix_3D, int n):
    cdef unsigned int slice
    cdef numpy.ndarray[DTYPE_t, ndim=2] t_den
    cdef numpy.ndarray[DTYPE_t, ndim=2] t_
    cdef numpy.ndarray[DTYPE_t, ndim=2] r_matrix
    cdef numpy.ndarray[DTYPE_t, ndim=3] final_p = numpy.empty_like(r_matrix_3D)

    for slice in range(r_matrix_3D.shape[0]):
        r_matrix = numpy.asarray(r_matrix_3D[slice, :, :])
        t_den = numpy.sqrt((1 - r_matrix ** 2)/(n-2))
        t_ = r_matrix / t_den
        final_p[slice, :, :] = (1-stdtr(n - 2, numpy.abs(t_))) * 2

    return final_p

def get_FDG_threshold_man(numpy.ndarray[DTYPE_t, ndim=3] p_matrix, DTYPE_t alpha):
    index_array = numpy.ones((p_matrix.shape[0], p_matrix.shape[1], p_matrix.shape[2]), dtype=bool)
    cdef numpy.ndarray[DTYPE_t, ndim=1] p_s = p_matrix[numpy.triu(index_array, 1)]
    p_s.sort()
    cdef int m = len(p_s)
    cdef int k=0
    for i in reversed(range(m)):
        if (p_s[i] <= i/m*alpha) and (p_s[i+1] > (i+1)/m*alpha):
            k=i
            break
    if k != 0:
        p_th = p_s[k]
    else:
        p_th = 0
    print(p_th)
    return p_th
导入numpy
纽比港
从scipy.special导入stdtr
DTYPE=numpy.float32
ctypedef numpy.float32\u t数据类型
def get_p_matrix_from_r_matrix_3D(数据类型[u t[:,::::1]r_matrix_3D,int n):
无符号整数片
cdef numpy.ndarray[DTYPE_t,ndim=2]t_den
cdef numpy.ndarray[DTYPE_t,ndim=2]t_
cdef numpy.ndarray[DTYPE_t,ndim=2]r_矩阵
cdef numpy.ndarray[DTYPE_t,ndim=3]final_p=numpy.empty_like(r_matrix_3D)
对于范围内的切片(r_矩阵_3D.shape[0]):
r_matrix=numpy.asarray(r_matrix_3D[slice,:,:])
t_den=numpy.sqrt((1-r_矩阵**2)/(n-2))
t_u=r_矩阵/t_数据
最后的p[slice,:,:]=(1-stdtr(n-2,numpy.abs(t))*2
返回最终\u p
def get_FDG_threshold_man(numpy.ndarray[DTYPE_t,ndim=3]p_矩阵,DTYPE_t alpha):
索引数组=numpy.one((p_-matrix.shape[0],p_-matrix.shape[1],p_-matrix.shape[2]),dtype=bool)
cdef numpy.ndarray[DTYPE_t,ndim=1]p_s=p_矩阵[numpy.triu(索引数组,1)]
p_.s.sort()
cdef int m=len(p_s)
cdef int k=0
对于反向(范围(m))中的i:
如果(p_s[i](i+1)/m*alpha):
k=i
打破
如果k!=0:
p_th=p_s[k]
其他:
p_th=0
打印(第页)
返回p_th