【问题标题】:Why the size of numpy array is different?为什么numpy数组的大小不同?
【发布时间】:2018-09-02 00:34:13
【问题描述】:

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

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

为什么?

【问题讨论】:

  • 能否包含您使用的代码?我无法重现您的示例

标签: numpy


【解决方案1】:

getsizeof 的价值有限。对于列表来说,这可能是一种方式。对于数组更好,但你必须了解数组是如何存储的。

In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896

但是看看viewsize

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 个“开销”。

【讨论】:

    【解决方案2】:

    它不会重现您的示例:

    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
    

    【讨论】:

    • 谢谢,我使用的代码来自其他人,请参阅:github.com/Maluuba/gensen。它是一个句子嵌入,可以将一个字符串(句子)转换成一个2048维的向量,所以每100个句子就有一个(100,2048)个向量。我也很困惑为什么 a 的大小只有 112,也许他们使用了一些我不知道的压缩技术。无论如何,我转换为列表,然后再转换回numpy数组,这很正常,谢谢。
    • 这里有一些关于 getsizeof stackoverflow.com/a/17574104/8069403 的细节,也许它可以帮助理解发生了什么
    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多