为什么numpy数组的大小不同?

时间:2018-09-01 15:31:10

标签: numpy

我有两个numpy a,b,它们的形状是(100,2048),我使用了sys.getsizeof(a) = 112,并且与数组b相同。

我有一个疑问,当我使用c = np.concatenate((a,b),axis=0)时,c的形状为(200,2048),但是sys.getsizeof(c) = 1638512

为什么?

2 个答案:

答案 0 :(得分:1)

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

所以我的猜测是您的ab是其他一些数组的视图。但是连接将产生一个具有自己数据缓冲区的新数组。这不可能是另外两个的观点。因此其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“开销”。

答案 1 :(得分:0)

它不会复制您的示例:

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