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

为什么numpy数组的大小不同?,numpy,Numpy,我有两个numpy a,b,它们的形状是1002048,我使用sys.getsizeofa=112,与数组b相同 我有一个问题,当我使用c=np.concatenatea,b,axis=0时,c的形状是2002048,但是sys.getsizeofc=1638512 为什么?它不会重现您的示例: import numpy as np import sys a = np.random.rand(100, 2048) b = np.random.rand(100, 2048) print(sys

我有两个numpy a,b,它们的形状是1002048,我使用sys.getsizeofa=112,与数组b相同

我有一个问题,当我使用c=np.concatenatea,b,axis=0时,c的形状是2002048,但是sys.getsizeofc=1638512


为什么?

它不会重现您的示例:

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
getsizeof的值有限。对于列表来说,它可能太离谱了。对于数组,这更好,但您必须了解数组是如何存储的

In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896
但看看视图的大小:

这显示数组对象的大小,但不显示共享数据缓冲区的大小。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'开销。

您能包括您使用的代码吗?我无法复制您的示例,我使用的代码来自其他人,请参阅:。这是一个句子嵌入,它可以将一个字符串句子转换成2048维向量,因此每100个句子有一个1002048维向量。我也弄不明白为什么a的大小只有112,也许他们使用了一些我不知道的压缩技术。不管怎样,我先转换成list,然后再转换回numpy数组,这很正常,谢谢。下面是关于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