为什么 numpy 数组的大小为 112 字节,而当我将其展平时,它有 96 字节的内存?

why numpy array has size of 112 byte and when I do flatten it, it has 96 byte of memory?

我有一个 numpy 数组,我用 np.ravel() 将它展平,当我试图了解这两个数组的大小时我很困惑

array =np.arange(15).reshape(3,5)

sys.getsizeof(array) 112

sys.getsizeof(array.ravel()) 96

array.size 15

array.ravel().size 15

array = np.arange(30).reshape(5,6)

sys.getsizeof(array) 112

sys.getsizeof(array.ravel()) 96

array.size 30

如上所示,两个不同的数组具有相同的内存大小,但每个数组的元素数量不同。为什么会这样?

根据文档

sys.getsizeof return numpy 数组的内存大小 https://docs.python.org/2/library/sys.html#sys.getsizeof

All built-in objects will return correct results, but this does not have to hold true for third-party extensions as it is implementation specific.

要查找 numpy 数组的内存大小,请使用 nbytes 或通过将大小乘以 itemsize

来计算它

array.nbytes

array.size * array.itemsize

正如 Joachim Wagner 指出的那样,如果你有很多 np 数组,每个数组都有轻微的开销,这可能是一个问题...... sys.getsizeof(array) 可能会给你这个开销的大小,但我我不确定

正如 Derte 提到的,sys.getsizeof 没有说明数组的大小。您得到的 96 保存有关数组的信息(如果它是一维的)和 112 如果它是多维的。假设您使用的是 dtype=int64.

,任何其他元素都会增加 8 个字节的大小

(1) ravel() 通常(请参阅下面@user2357112 的评论)returns 引用输入项而不是制作新副本的对象:

>>> a = np.arange(15)
>>> b = a.ravel()
>>> b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> a[0]=5
>>> b
array([ 5,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) 

sys.getsizeof(array.ravel())无论array有多大都不会改变。

(2) 同样,reshape() 不复制项目:

>>> b = a.reshape(3,5)
>>> b
array([[ 5,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a[0] = 7
>>> b
array([[ 7,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]]) 

同样,当您增加输入数组的大小时(并相应地调整形状),内存使用量保持不变。

(3) 是的,其他答案是正确的,因为 sys.getsizeof() 可能缺少第三方对象所需的一些内存。不过简单测试一下,说明numpy数组的主要部分都占了:

>>> sys.getsizeof(np.arange(20))
256
>>> sys.getsizeof(np.arange(40))
416
>>> sys.getsizeof(np.arange(400))
3296