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

Python 标准化4D阵列的最有效方法是什么?,python,numpy,Python,Numpy,我有一个4D阵列的形状(4320328279),它实际上是一个由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();

我有一个4D阵列的形状(4320328279),它实际上是一个由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;
但这真的很慢

我怎样才能使它更快

有什么想法吗


Tom

我想我最终找到了一个非常快速的方法,实际上是以用户3483203的方式:

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秒而不是几个小时:)

使用
mx=mat.max(0);mn=材料最小值(0);(mat-mn)/(mx-mn)
规格化是基于整个数组的最小值和最大值,还是仅仅基于四个像素?您的矩阵是什么数据类型?我猜这些是无符号8位整数,对于灰度图像?