这是在ipython3中执行的代码
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)。
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)发布于 2020-10-12 17:53:50
根据astype上的numpy文档,这是一个“不安全的转换”,意思是“任何数据转换都可能完成”。他们没有说准确的转换是如何完成的,我也没有在快速搜索文档时找到它,所以它可能依赖于实现。
我的猜测如下:首先,将32位浮点数转换为8位有符号整数,缺省为向零截断,例如。-1.3变成-1。然后进行从无符号8位整数到8位无符号整数的转换,得到值255。就像这样
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的转换规则是如何工作的参考资料。
发布于 2020-10-12 17:53:26
您转换为unsigned int 8,其中-1对应255,-2对应254等。如果您想要获取-1,-2,您必须使用np.int8将其转换为带符号的int8:
>>> np.float32(-2.0358603).astype(np.uint8)
254
>>> np.float32(-2.0358603).astype(np.int8)
-2 发布于 2021-08-28 12:58:20
其他答案已经解决并解释了问题。然而,我可以提出一个可能实用的替代方案:
np.uint8(np.clip(x, 0, 255))其中x是您的浮点型数组。
这种方法确保负数变为0,巨大的正数(> 255)变为255。
例如
>>> x = [223.2, 888.2, -32, 255.3, 255]
>>> np.uint8(np.clip(x, 0, 255))
array([223, 255, 0, 255, 255], dtype=uint8)https://stackoverflow.com/questions/64314899
复制相似问题