You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Numpy数组与ravel扁平化后内存不同且不同元素量数组内存一致?

为什么不同大小的Numpy数组及其ravel结果的sys.getsizeof值相同?

这是个很常见的误区——你混淆了数组对象本身的内存占用和数组元素实际存储的内存总量,咱们一步步拆解清楚:

1. sys.getsizeof()的真实作用

sys.getsizeof() 只负责测量Python对象本身在内存中的大小,对于Numpy的ndarray来说,它统计的仅仅是数组这个「管理容器」的内存,完全不包含数组里所有元素存储的实际数据。

2. Numpy数组的两层内存结构

Numpy数组本质上分为两个部分:

  • 元数据层:就是ndarray对象本身,包含数组的形状(shape)、数据类型(dtype)、指向数据缓冲区的指针、步长(strides)等管理信息。这部分的大小是固定的(或者说变化可以忽略不计),不管你的数组有15个元素还是30个元素,这个管理对象的内存占用基本不变——这就是你两次测试中sys.getsizeof(array)都是112的核心原因。
  • 数据缓冲区:这才是真正存储数组元素的地方,它的大小由「元素数量 × 单个元素字节数」决定,比如int64类型的元素每个占8字节,15个元素就是120字节,30个就是240字节。

3. ravel()的本质

array.ravel() 大多数情况下会返回原数组的视图(view)——它不会复制数据,只是创建一个新的ndarray对象,修改了元数据里的形状(改成一维)和步长,底层依然指向原数组的数据缓冲区。所以这个新的视图对象本身的内存占用也是固定的,和元素数量无关,这就是你看到两次sys.getsizeof(array.ravel())都是96的原因。

4. 如何正确计算数组的总内存占用

如果你想知道数组所有元素实际占用的内存,应该用Numpy提供的nbytes属性:

import numpy as np
import sys

array = np.arange(15).reshape(3,5)
print(array.nbytes)  # 输出120(15×8,int64类型)
print(array.ravel().nbytes)  # 同样输出120,因为共享数据缓冲区

array2 = np.arange(30).reshape(5,6)
print(array2.nbytes)  # 输出240(30×8)

你还可以验证ravel返回的是视图:

print(array.ravel().base is array)  # 输出True,说明共享原数据缓冲区

内容的提问来源于stack exchange,提问作者Timur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:49:11