我有两个numpy a,b
,它们的形状是(100,2048),我使用sys.getsizeof(a) = 112
和数组b相同。
我有疑问,当我使用c = np.concatenate((a,b),axis=0)
时,c的形状是(200,2048),但是sys.getsizeof(c) = 1638512
为什么?
getsizeof
价值有限。它可以用于列表。对于数组来说,它更好,但您必须了解数组的存储方式。
In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896
但是看看size
的view
:
In [450]: b = a.reshape(10,10)
In [451]: sys.getsizeof(b)
Out[451]: 112
这显示了数组对象的大小,但不显示共享数据缓冲区的大小。 b
没有自己的数据库。
In [453]: a.size
Out[453]: 100
In [454]: b.size
Out[454]: 100
所以我的猜测是你的a
和b
是其他一些数组的视图。但是连接产生了一个带有自己的数据缓冲区的新数组。它不能是另外两个的看法。所以它的getsizeof
反映了这一点。
In [457]: c = np.concatenate((a,b.ravel()))
In [459]: c.shape
Out[459]: (200,)
In [460]: c.size
Out[460]: 200
In [461]: sys.getsizeof(c)
Out[461]: 1696
a
的数据缓冲区是100 * 8字节,因此'开销'是96.对于c
,200 * 8,再次使用96'开销'。
它不会重现您的示例:
import numpy as np
import sys
a = np.random.rand(100, 2048)
b = np.random.rand(100, 2048)
print(sys.getsizeof(a), sys.getsizeof(b))
# 1638512 1638512
c = np.concatenate((a,b), axis=0)
print(sys.getsizeof(c))
# 3276912 which is about 1638512 + 1638512