我有一个形状为(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;
但这真的很慢!
如何使它更快?
有什么想法吗?
汤姆
答案 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秒钟而不是我的机器上的几个小时:)