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