python - 分配给数组更改 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 记住了矩阵的原始类型——但为什么第一种方法可以做赋值,而第二种方法不行呢?
解决方案
这是因为通过在第二种方法中分配回数组,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]])
推荐阅读
- python - Sublime Text x Python - @property
- c# - 从 IDirect3DSurface 到 SoftwareBitmap 的无效转换
- ruby-on-rails - Rails 中全局级别的多个数据库
- docker - CI/CD 管道的 Docker 效率
- python - 从 ResNet50 网络中删除最后 n 层
- python - 交叉引用一个数据框与另一个特定条目以查找产品 ID 名称
- python-3.x - KRS ekrs.ms.gov.pl 从请求中获取文件
- javascript - 如何禁用按钮直到所有必填字段都已填写
- java - 如何使标签和按钮居中?
- c++ - 如何在 ROS C++ 节点中使用 pthread