我有一个多维数组,其中包含灰度整数值,需要将其标准化为0-1范围。更准确地说,所讨论的多维数组是一个数组,其中每个元素都包含代表特定图像的矩阵,并且每个矩阵(图像)都包含图像的像素,这些像素的整数值在0-255之间。
这里是归一化功能:
def normalize(x, mmin=0.0, mmax=255.0):
x = (x - mmin )/(mmax - mmin + 10**(-5))
return x
右:在主模块中,我以这种方式应用该功能:
trainingSet_Images = myUtils.normalize(trainingSet_Images)
结果正确地是具有浮点值的矩阵数组。
错误:但是以这种方式应用normalize()
功能:
for i in range(len(trainingSet_Images)):
trainingSet_Images[i] = myUtils.normalize(trainingSet_Images[i])
trainingSet_Images的所有元素都是具有零值的整数矩阵。
似乎Python记住了矩阵的原始类型-但是为什么第一种进行赋值的方法起作用而第二种却不起作用?
这是因为通过像第二种方法一样分配给数组,执行归一化后得到的dtype
(将是float
)被向下转换为数组dtpye
,因此它得到地板。
这在文档的Assigning values to indexed arrays部分中提到,并指出:
请注意,如果将较高的类型分配给较低的类型(例如,将浮点数分配给整数),甚至将异常(将复杂的值分配给浮点数或整数),分配都可能导致更改。
这是从应用normalize
函数的结果中分配回来的示例:
a = np.array([[255,255,255],[0,255,255]])
normalize(a)
array([[0.99999996, 0.99999996, 0.99999996],
[0. , 0.99999996, 0.99999996]])
而在第二种方法中:
normalize(a[1])
# array([0. , 0.99999996, 0.99999996])
a[1] = normalize(a[1])
print(a)
array([[255, 255, 255],
[ 0, 0, 0]])
如果您这样做,同样适用:
a[:] = normalize(a)
print(a)
array([[0, 0, 0],
[0, 0, 0]])