Numpy视图内存占用疑问:视图存储指针还是浮点对象?
Numpy视图相关疑问解答
一、Numpy视图是存储指针还是浮点对象?
- Numpy视图不存储实际的浮点(或其他类型)数据对象,它本质是个轻量级的ndarray对象,核心存的是:
- 指向原数组底层数据缓冲区的指针
- 自身的形状、步长、数据类型等元信息
- 视图和原数组共享同一块内存缓冲区,对视图的修改会直接同步到原数组,这就是@juanpa提到的“共享底层缓冲区”,也就是你理解的按引用传递。
二、滑动窗口视图与副本的内存差异问题
代码场景
你用到的滑动窗口视图代码:
import numpy as np arr = np.lib.stride_tricks.sliding_window_view( np.arange(510), 50, axis=0 )
内存差异的核心原因
.nbytes的计算逻辑:.nbytes算的是数组所有元素的总字节数,不管数据是不是共享的。滑动窗口视图有510-50+1=461个窗口,每个窗口50个int元素(按int64算,每个8字节),总字节数是461*50*8=184400,和副本的元素总字节数一致,所以返回值相同。
sys.getsizeof()的计算逻辑:sys.getsizeof()只算Python对象自身占用的内存,不包含它引用的底层数据缓冲区。- 滑动窗口视图只是个持有元数据(指针、形状、步长等)的轻量对象,所以大小只有128字节左右。
- 副本是独立的ndarray,会重新分配内存存储所有元素,
sys.getsizeof()会把这些元素的内存加上对象元数据的大小一起算,所以总大小达到184528字节。
- 关于只读特性:滑动窗口视图默认只读是为了避免步长不连续导致的写入错误,但这不影响它共享原缓冲区的本质。
内容的提问来源于stack exchange,提问作者feiyang472
相关产品推荐
相关产品推荐

