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



例如,我知道 float通常由c double表示,并且根据文档,整数具有无限的精度。Numpy当然会提供更多的特定类型。例如,numpy中的float的类型是否会影响内存中数字的精度?还是以相同精度存储的各种类型的数字,该类型只是在较高级别上以不同的方式实现数字?

上面的注释是完全正确的,还提到了某种形式的检查。

,但让我们做一些很小的演示,让我们读取消耗的记忆:

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)

out:

24
12
48

您也可以读取每个项目的大小:

c.itemsize
# 16

通常,如果您知道某些C/C 类型,这对于大多数类型都是直观的,除了一个例外:Bool将为每个条目提供完整的字节(尽管有点!),这也记录在链接中。下面!

最重要的文档输入可能是您可以查询的属性的类型浏览和ndarray的数据类型。

注意,您可以通过修改基础内存来自己看到这一点,因为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)

现在,让我们将内存投入到未签名的char类型

>>> 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])

最新更新