分配数组更改dtype [重复]

问题描述 投票:1回答:1

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

python numpy multidimensional-array numpy-ndarray
1个回答
0
投票

这是因为通过像第二种方法一样分配给数组,执行归一化后得到的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]])
© www.soinside.com 2019 - 2024. All rights reserved.