Эффективная реализация следующего фрагмента кода - PullRequest
0 голосов
/ 12 октября 2018

У меня есть функция, которая вычисляет среднюю глубину трехмерного объема.Есть ли способ сделать код более эффективным с точки зрения времени выполнения.Объем имеет следующую форму.

volume = np.zeros((100, 240, 180))

Объем может содержать число 1 для разных вокселей, и цель состоит в том, чтобы найти среднюю глубину (среднюю координату Z), используя взвешенное среднее для всех занятых ячеекв объеме.

def calc_mean_depth(volume):
        '''

        Calculate the mean depth of the volume. Only voxels which contain a value are considered for the mean depth

        Parameters:
        -----------
        volume: (100x240x180) numpy array
         Input 3-D volume which may contain value of 1 in its voxels
        Return: 
        -------
        mean_depth :<float>
        mean depth calculated
        '''
        depth_weight = 0
        tot = 0
        for z in range(volume.shape[0]):
            vol_slice = volume[z, :, :] # take one x-y plane
            weight = vol_slice[vol_slice>0].size  # get number of values greater than zero
            tot += weight   #  This counter is used to serve as the denominator
            depth_weight += weight * z   # the depth plane into number of cells in it greater than 0.
        if tot==0:
            return 0
        else:
            mean_depth = depth_weight/tot
            return mean_depth

1 Ответ

0 голосов
/ 12 октября 2018

Это должно работать.Используйте count_nonzero для суммирования и усреднения в конце.

def calc_mean_depth(volume):
    w = np.count_nonzero(volume, axis = (1,2))
    if w.sum() == 0:
        return 0
    else
        return (np.arange(w.size) * w).sum() / w.sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...