分配给数组更改dtype

时间:2020-04-16 08:36:07

标签: python numpy multidimensional-array numpy-ndarray

我有一个多维数组,其中包含灰度整数值,需要将其标准化为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似乎记得矩阵的原始类型-但是为什么第一种进行赋值的方法起作用而第二种却不起作用呢?

1 个答案:

答案 0 :(得分:0)

这是因为通过像第二种方法一样分配给数组,执行规范化后的结果dtype(将是float)被向下转换为数组{{1} },因此它会充斥

在文档的Assigning values to indexed arrays部分中提到了这一点,并指出:

请注意,如果将较高的类型分配给较低的类型(例如,将浮点数分配给整数),甚至将异常(将复杂的值分配给浮点数或整数),分配都可能导致更改


以下是从应用dtpye函数的结果中分配回来的示例:

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]])