BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #23267同步于 2019/1/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

python中如何进行数据类型转换?

cheng1997
2019/1/22镜像同步10 回复
RT,最近在做图像处理问题,对于自己创建的numpy数组需要转化为uint8类型,然后使用opencv进行显示,但是由于自己粗心遇到了一个小bug,如下描述。 a = np.array(171) # a的类型为int32, 类型为float64时也会出同样错误 b = a.astype("int8") # 这里是int8,类型为uint8一切正常 print(a,b) # 出现的bug为 a数值是171,而b为-85 想询问一下有没有大佬知道怎么回事,如果能顺便解析一波类型转换的原理是最好的了[ema23]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lizhe123456机器人#1 · 2019/1/22
171 - 128 -128=-85,也就是说,int8只能表示 -128~127的数。
xxyljc机器人#2 · 2019/1/22
因为数值在计算机中是用补码来表示和存储的?
qcts机器人#3 · 2019/1/22
int8和uint8是不一样的啊……
lance6716机器人#4 · 2019/1/22
这个是numpy的范围吧,去看numpy文档。 哇,numpy的文档看不懂 https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.astype.html
cheng1997机器人#5 · 2019/1/22
能问一下,为什么要减两个128吗?没看懂。。 【 在 lizhe123456 的大作中提到: 】 : 171 - 128 -128=-85,也就是说,int8只能表示 -128~127的数。
cheng1997机器人#6 · 2019/1/22
我也知道不一样,当时一个小错误,现在在思考为什么会出现这个bug..[ema1] 【 在 qcts 的大作中提到: 】 : int8和uint8是不一样的啊……
dxy1机器人#7 · 2019/1/22
【 在 cheng1997 的大作中提到: 】 : 能问一下,为什么要减两个128吗?没看懂。。 一直取余直到在规定范围,这个书上都有公式的
Nroskill机器人#8 · 2019/1/22
171 换成二进制就是 00....0010101011 强行截断为int8就是 10101011 有符号数的最高位为符号位 存的都是补码 所以输出时需要转为原码 因为是负数所以各位取反再+1 即11010101 == -(64+16+4+1) == -85 无符号数没有符号位 所以没区别 如果不想了解这么细 要学会计算范围的方法 比如此例中就是int8就是[-2^7,2^7-1],即[-128,127] uint8就是[0, 2^8-1],即[0,255] 明显前者越界了 这个如果没记错应该是本科时计算机组成原理学的
lizhe123456机器人#9 · 2019/1/23
因为你可以试一下,128表示为int8变成-128,129为-127,这样就相当于减去两个128。当然,正确的解释应该从补码的角度考虑。 【 在 cheng1997 (长生在世) 的大作中提到: 】 : 能问一下,为什么要减两个128吗?没看懂。。