Python 中的 numpy 定义 dtype 为 short 以后为什么赋值 32768 的值是-32768 ?

2020-05-04 18:28:49 +08:00
 SystemLight

a = np.array([1, 2, 3, 4, 5, 6, 32768]) a.dtype = np.short print(a)

输出: [ 1 0 2 0 3 0 4 0 5 0 6 0 -32768 0]

输出的结果为什么分成了两个值了呢?

2432 次点击
所在节点    Python
7 条回复
minami
2020-05-04 18:33:34 +08:00
呃,这是被转型了吧,没发现数组长度都不对了吗?你要初始化时就指定 dtype,不要这样强转
junkun
2020-05-04 18:50:46 +08:00
short 补码的表示范围就是-32768~32767,没办法表示 32768 。
SystemLight
2020-05-04 19:08:56 +08:00
@junkun 是的是的,明白了

@minami 还真是,感谢启发,我输出值以后从 np.short 类型转成了 python int 类型,所以最高位变了,符号位置也就变了

python_val = -32769

print(bin(python_val)) # 符号位+中间数字+已有的 16 位数字位 -0b1000000000000001 存成补码 1...1...0111111111111111

print(python_val)

numpy_short_val = np.short(python_val) # numpy 得到以后把只取 16 位,发现最高位是 0 为正数,正数原码=补码 0111111111111111

print(bin(numpy_short_val)) # 当 python 再读取出来时:0111111111111111 就是 32767

print(numpy_short_val)
byaiu
2020-05-04 19:12:09 +08:00
其实 dtype 是可以强转的,在数据很大的时候是很有必要的。
SystemLight
2020-05-04 19:17:12 +08:00
@byaiu 但是我这样转换,数组大小却变了
byaiu
2020-05-05 07:59:05 +08:00
@SystemLight 说明原始的类型不是 short 而是 int 。
我以前是有处理十多个 G 数据的需求,数据可以直接用 np.fromfile 从文件里直接获取,同时要指定 dtype 。然后改变 dtype 来按照不同的格式观察同一数据。
enrio
2020-05-05 15:49:44 +08:00
钓,就硬钓。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX