做python';s数字类型会影响数字的低级精度吗?

做python';s数字类型会影响数字的低级精度吗?,python,numpy,Python,Numpy,例如,据我所知,float通常用Cdouble来表示,整数的精度是无限的。当然,提供了更具体的类型。例如,NumPy中的float类型是否会以任何方式影响内存中的数字精度?或者,不同类型的数字是否以相同的精度存储,而该类型只是在更高的级别上以不同的方式实现数字?上述注释完全正确,还提到了某种形式的检查 但让我们做一些小的演示,我们可以在其中查看消耗的内存: import numpy as np a = np.array([1,2,3], dtype=float) print(a.nbytes)

例如,据我所知,
float
通常用C
double
来表示,整数的精度是无限的。当然,提供了更具体的类型。例如,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)
输出:

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

c.itemsize
# 16
一般来说,如果您知道一些C/C++类型,这对大多数类型来说都是非常直观的,但有一个例外:bool将为每个条目获取一个完整的字节(尽管有一点!),这也在下面的链接中有说明


这方面最重要的文档条目可能是类型概述和您可以查询的属性。

注意,您可以通过修改底层内存来查看这一点,因为
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)
现在,让我们

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

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

是的,绝对是
numpy
类型对应于存储在基元数组中的实际基元数字类型。您可以通过查看任何给定numpy数组的底层缓冲区上的字节来检查这一点!如果您喜欢以内存效率高的方式处理低级数据类型,它将为您提供许多功能强大的功能。基本上,您可以将
numpy
看作是围绕实现真正多维数组的基本C数组的面向对象包装器。…。@juanpa.arrivillaga。作为C的粉丝,这很可能是一个很深的兔子洞。对任何感兴趣的人来说,是的。如果您熟悉C语言,那么您肯定应该看看普通的Python
struct
ctypes
模块。
>>> 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])