python和numpy

时间:2019-01-18 08:48:49

标签: python python-3.x

我试图确定python中不同数据类型的大小,并编写了以下代码。每行的输出在它们旁边显示为注释。

import numpy as np
import sys
print(sys.version) # 3.6.7
print(np.version.version) # 1.15.4

i = 2
print(type(i)) # <class 'int'>
print(sys.getsizeof(i)) # 28

j = np.int64(3)
print(type(j)) # <class 'numpy.int64'>
print(sys.getsizeof(j)) # 32

a = np.array([[1,2],[3,4],[5,6]])
print(type(a)) # <class 'numpy.ndarray'>
print(sys.getsizeof(a))   # 160
print(type(a[0][0])) # <class 'numpy.int64'>
print(sys.getsizeof(a[0][0])) # 32

a = np.array([[1,2],[3,4],[5,6],[7,8]])
print(sys.getsizeof(a))   # 176

从上面的输出中,一个6元素数组的大小为160,而一个8元素数组的大小为176,所以我可以得出结论,数组中每个元素的大小为8字节,并且数组标头的大小(常数)是112个字节?每个元素的大小是恒定的还是取决于其值(大还是小)?

另外,当我打印a [0] [0]的大小时,为什么我得到32而不是8? python和numpy整数和数组背后的数学到底是什么?

1 个答案:

答案 0 :(得分:0)

实际上,“ sys.getsizeof ”不适用于确定numpy中的大小。它只适用于内置的python对象。

  

以字节为单位返回对象的大小。该对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但是对于第三方扩展,这不一定成立,因为它是特定于实现的。

     

getsizeof()调用对象的 sizeof 方法,如果该对象由垃圾收集器管理,则会添加额外的垃圾收集器开销。

对于 numpy.ndarray 使用 nbytes ,它是 size * itemsize

a = np.array([[3,4],[8,0],[9,8],[7,0]])
a.size # 8
a.itemsize # 8
a.nbytes # 64
a = np.array([[3,4],[8,0],[9,8],[7,0]],dtype=np.int32)
a.size # 8
a.itemsize # 4
a.nbytes # 32