首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy.astype(np.uint8)如何转换浮点数组?-1.2997805变成了255

numpy.astype(np.uint8)如何转换浮点数组?-1.2997805变成了255
EN

Stack Overflow用户
提问于 2020-10-12 17:13:23
回答 3查看 5.2K关注 0票数 3

这是在ipython3中执行的代码

代码语言:javascript
复制
In [81]: r2
Out[81]: 
array([-1.2997805, -1.4251276, -1.3047135, ..., -2.0358603, -1.9741256,
       -1.6412157], dtype=float32)

In [82]: r2.astype(np.uint8)
Out[82]: array([255, 255, 255, ..., 254, 255, 255], dtype=uint8)

如何将-1.2997805转换为255?

添加:在下面的评论中(谢谢),我是这样测试的。看起来浮点数转换成了整数,并且完成了255的模运算(将其读作无符号int8)。

代码语言:javascript
复制
is first convereted to int. and the it is cut using modulo(%).  
In [98]: b
Out[98]: array([-1.,  0.,  1.])

In [99]: b.astype(np.uint8)
Out[99]: array([255,   0,   1], dtype=uint8)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-12 17:53:50

根据astype上的numpy文档,这是一个“不安全的转换”,意思是“任何数据转换都可能完成”。他们没有说准确的转换是如何完成的,我也没有在快速搜索文档时找到它,所以它可能依赖于实现。

我的猜测如下:首先,将32位浮点数转换为8位有符号整数,缺省为向零截断,例如。-1.3变成-1。然后进行从无符号8位整数到8位无符号整数的转换,得到值255。就像这样

代码语言:javascript
复制
float x = -1.2997805;  # Assume float is 32-bit
(uint8_t)(int8_t)x;

这与使用(uint8_t)x直接转换为8位无符号整数是不同的,后者至少在我测试的平台上是0(龙珠的x86-64的gcc)。

这类事情是very confusing的,甚至可能是平台相关的(可能取决于什么操作系统,numpy版本,FP硬件决定做什么,或者处理器是否使用2补码,等等),所以在不确切知道你将在什么平台上运行代码的情况下,永远不要依赖这种行为,而且这是糟糕的编码实践。令人惊讶的是,我找不到关于numpy的转换规则是如何工作的参考资料。

票数 2
EN

Stack Overflow用户

发布于 2020-10-12 17:53:26

您转换为unsigned int 8,其中-1对应255,-2对应254等。如果您想要获取-1,-2,您必须使用np.int8将其转换为带符号的int8:

代码语言:javascript
复制
>>> np.float32(-2.0358603).astype(np.uint8)
254                                        
>>> np.float32(-2.0358603).astype(np.int8) 
-2                                         
票数 3
EN

Stack Overflow用户

发布于 2021-08-28 12:58:20

其他答案已经解决并解释了问题。然而,我可以提出一个可能实用的替代方案:

代码语言:javascript
复制
np.uint8(np.clip(x, 0, 255))

其中x是您的浮点型数组。

这种方法确保负数变为0,巨大的正数(> 255)变为255。

例如

代码语言:javascript
复制
>>> x = [223.2, 888.2, -32, 255.3, 255]
>>> np.uint8(np.clip(x, 0, 255))
array([223, 255,   0, 255, 255], dtype=uint8)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64314899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档