1

こんにちは、相関 (r) 値の 3D マトリックスの p 値を計算し、完全な p マトリックスの FDR しきい値を計算したいと思います (FDR は上三角 p 値のみに基づいて計算されます)。3D マトリックスは大規模です (208、3544、3544)。現時点では、これらの cython 関数を使用してこれを行います。ただし、高速化し、可能であれば RAM の使用量を減らしたいと考えています。手伝ってくれますか?

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
4

0 に答える 0