python的数字类型会影响数字的低级精度吗?

时间:2017-12-13 22:44:34

标签: python numpy

例如,我了解float通常由C double表示,而整数的精度不受docs的限制。 NumPy当然提供更具体的类型。例如,NumPy中float的类型是否会以任何方式影响数字在内存中的精确度?或者是以相同的精度存储各种类型的数字,而类型只是在更高的层次上以不同的方式实现数字?

2 个答案:

答案 0 :(得分:3)

上述评论完全正确,并提到某种形式的检查。

但是,让我们做一些微小的演示,我们read out消耗的内存:

import numpy as np

a = np.array([1,2,3], dtype=float)
print(a.nbytes)
b = np.array([1,2,3], dtype=np.float32)
print(b.nbytes)
c = np.array([1,2,3], dtype=np.longfloat)  # this one: OS/Build-dependent
print(c.nbytes)

输出:

24
12
48

您还可以读出每件商品的尺寸:

c.itemsize
# 16

一般来说,如果您了解一些C / C ++类型,这对于大多数类型来说非常直观,但有一个例外:bool将为每个条目占用一个完整的字节(尽管有点!),这也在链接中记录下面!

对于类型概述,最重要的文档条目可能是Data types,对于您可以查询的属性,ndarray可能是{{3}}。

答案 1 :(得分:3)

注意,您可以通过修改底层内存来自行查看,因为numpy数组实现了缓冲协议,我们可以创建memoryview

>>> arr32 = np.array([1,2,3], dtype=np.int32)
>>> arr64 = np.array([1,2,3], dtype=np.int64)
>>> arr32
array([1, 2, 3], dtype=int32)
>>> arr64
array([1, 2, 3])
>>> buff32 = memoryview(arr32)
>>> buff64 = memoryview(arr64)

现在,让我们cast the memory to unsigned char type

>>> casted32 = buff32.cast('B')
>>> casted64 = buff64.cast('B')
>>> list(casted32)
[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]
>>> list(casted64)
[1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0]

看起来它实际上在内存中的大小不同。看看我能做些什么!:

>>> casted32[1] = 1
>>> casted64[2] = 1
>>> arr32
array([257,   2,   3], dtype=int32)
>>> arr64
array([65537,     2,     3])