标准化4D阵列的最有效方法是什么?

时间:2019-10-16 13:42:07

标签: python numpy

我有一个形状为(4,320,528,279)的4D数组,实际上是4个3D图像堆栈的数据集。

我要实现的是对所有样本之间的每个3D图像的每个像素进行标准化。因此,假设在四个图像中具有坐标(0,0,0)的第一个像素值为[140.,20.,10.,220.]。我想更改这些值,以使它们变为:[0.61904762,0.04761905,0.,1。]。

我写了一个脚本,据说可以达到这个目的:

def NormalizeMatrix(mat) :

    mat = np.array(mat);
    sink = mat.copy();

    for i in np.arange(mat.shape[1]) :

        for j in np.arange(mat.shape[2]) :

            for k in np.arange(mat.shape[3]) :

                PixelValues = mat[:,i,j,k];
                Min = float(PixelValues.min());
                Max = float(PixelValues.max());

                if Max-Min != 0. :

                    sink[:,i,j,k] = (PixelValues - Min) / (Max - Min);

                else :

                    sink[:,i,j,k] = np.full_like(PixelValues, 0.);

    return sink;

但这真的很慢!

如何使它更快?

有什么想法吗?

汤姆

1 个答案:

答案 0 :(得分:0)

我想我最终找到了一种相当快的方法,实际上与user3483203的方式相同:

def NormalizeMatrix(mat) :

    mat = np.array(mat);
    minMat = np.min(mat, axis=0, keepdims=1);
    maxMat = np.max(mat, axis=0, keepdims=1);

    sink = (mat - minMat)/ (maxMat - minMat);

    return sink;

这需要5到10秒钟而不是我的机器上的几个小时:)