【问题标题】:why numpy array has size of 112 byte and when I do flatten it, it has 96 byte of memory?为什么 numpy 数组的大小为 112 字节,当我展平它时,它有 96 字节的内存?
【发布时间】:2020-02-06 16:12:57
【问题描述】:

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

数组 =np.arange(15).reshape(3,5)

sys.getsizeof(数组) 112

sys.getsizeof(array.ravel()) 96

数组.大小 15

array.ravel().size 15

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

sys.getsizeof(数组) 112

sys.getsizeof(array.ravel()) 96

数组.大小 30

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

【问题讨论】:

  • 您正在测试的所有数组都是视图,并且不拥有自己的数据缓冲区

标签: python numpy reshape


【解决方案1】:

(1) ravel() 通常(参见下面的 @user2357112 的 cmets)返回一个引用输入项而不是制作新副本的对象:

>>> 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]) 

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

(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

【讨论】:

  • ravel() 通常返回一个视图。如果输入步幅无法创建平面视图,ravel() 将进行复制。这经常被遗忘。
  • reshape相同。
【解决方案2】:

sys.getsizeof 不返回 numpy 数组的内存大小,根据文档 https://docs.python.org/2/library/sys.html#sys.getsizeof

所有内置对象都会返回正确的结果,但这并不一定适用于第三方扩展,因为它是特定于实现的

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

array.nbytes

array.size * array.itemsize

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

【讨论】:

  • python 对象和告诉 numpy 项目的类型有额外的内存开销,例如int32float64.
  • 第三方扩展是指python的库(社区制作)吗?
  • 是的,任何不是 python 开箱即用的东西都是非内置的
【解决方案3】:

正如 Derte 所提到的,sys.getsizeof 并没有说明数组的大小。你得到的96 是关于数组的信息(如果它是一维的)和112 如果它是多维的。假设您使用的是dtype=int64,任何额外的元素都会增加 8 个字节的大小。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多