为什么 numpy 数组的大小为 112 字节,而当我将其展平时,它有 96 字节的内存?
why numpy array has size of 112 byte and when I do flatten it, it has 96 byte of memory?
我有一个 numpy 数组,我用 np.ravel() 将它展平,当我试图了解这两个数组的大小时我很困惑
array =np.arange(15).reshape(3,5)
sys.getsizeof(array)
112
sys.getsizeof(array.ravel())
96
array.size
15
array.ravel().size
15
array = np.arange(30).reshape(5,6)
sys.getsizeof(array)
112
sys.getsizeof(array.ravel())
96
array.size
30
如上所示,两个不同的数组具有相同的内存大小,但每个数组的元素数量不同。为什么会这样?
根据文档 sys.getsizeof
return numpy 数组的内存大小 https://docs.python.org/2/library/sys.html#sys.getsizeof
All built-in objects will return correct results, but this does not have to hold true for third-party extensions as it is implementation specific.
要查找 numpy 数组的内存大小,请使用 nbytes
或通过将大小乘以 itemsize
来计算它
array.nbytes
array.size * array.itemsize
正如 Joachim Wagner 指出的那样,如果你有很多 np 数组,每个数组都有轻微的开销,这可能是一个问题...... sys.getsizeof(array)
可能会给你这个开销的大小,但我我不确定
正如 Derte 提到的,sys.getsizeof
没有说明数组的大小。您得到的 96
保存有关数组的信息(如果它是一维的)和 112
如果它是多维的。假设您使用的是 dtype=int64
.
,任何其他元素都会增加 8 个字节的大小
(1) ravel()
通常(请参阅下面@user2357112 的评论)returns 引用输入项而不是制作新副本的对象:
>>> 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])
sys.getsizeof(array.ravel())
无论array
有多大都不会改变。
(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
我有一个 numpy 数组,我用 np.ravel() 将它展平,当我试图了解这两个数组的大小时我很困惑
array =np.arange(15).reshape(3,5)
sys.getsizeof(array) 112
sys.getsizeof(array.ravel()) 96
array.size 15
array.ravel().size 15
array = np.arange(30).reshape(5,6)
sys.getsizeof(array) 112
sys.getsizeof(array.ravel()) 96
array.size 30
如上所示,两个不同的数组具有相同的内存大小,但每个数组的元素数量不同。为什么会这样?
sys.getsizeof
return numpy 数组的内存大小 https://docs.python.org/2/library/sys.html#sys.getsizeof
All built-in objects will return correct results, but this does not have to hold true for third-party extensions as it is implementation specific.
要查找 numpy 数组的内存大小,请使用 nbytes
或通过将大小乘以 itemsize
array.nbytes
array.size * array.itemsize
正如 Joachim Wagner 指出的那样,如果你有很多 np 数组,每个数组都有轻微的开销,这可能是一个问题...... sys.getsizeof(array)
可能会给你这个开销的大小,但我我不确定
正如 Derte 提到的,sys.getsizeof
没有说明数组的大小。您得到的 96
保存有关数组的信息(如果它是一维的)和 112
如果它是多维的。假设您使用的是 dtype=int64
.
(1) ravel()
通常(请参阅下面@user2357112 的评论)returns 引用输入项而不是制作新副本的对象:
>>> 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])
sys.getsizeof(array.ravel())
无论array
有多大都不会改变。
(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