首页 > 解决方案 > 分配给数组更改 dtype

问题描述

我有一个包含灰度整数值的多维数组,需要将其标准化为 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 记住了矩阵的原始类型——但为什么第一种方法可以做赋值,而第二种方法不行呢?

标签: pythonnumpymultidimensional-arraynumpy-ndarray

解决方案


这是因为通过在第二种方法中分配回数组,dtype执行归一化的结果(将是 a float)被向下转换为 array dtpye,因此它被floored

这在文档的为索引数组分配值部分中提到,其中指出:

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


这是一个从应用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]])

推荐阅读