Numpy:切片后的垃圾收集

Nic*_*Nic 5 python garbage-collection memory-leaks numpy numpy-ndarray

def foo():
    x = np.ones((10,10))
    return x[:5,:5]
Run Code Online (Sandbox Code Playgroud)

如果我调用,y = foo()我将得到一个 5x5 数组( 中值的 1/4 x)。但是 中的其他值会发生什么情况x,它们是否会保留在内存中或以某种方式被垃圾收集?我想了解这一点。

use*_*ica 3

正如 kindall 在评论中所说, NumPy 数组上的基本切片创建了原始数组的视图。视图必须保持整个原始对象处于活动状态;您可以在视图的base属性中看到它用于执行此操作的引用。

In [2]: x = numpy.ones((10, 10))

In [3]: y = x[:5, :5]

In [4]: y.base is x
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是 `y = y.copy()` 会导致 `x` 被清理 (4认同)
  • 是的,由于“y”,整个数组被保留。这里不涉及垃圾收集器;这是引用计数的一个简单例子。“x”是对数组的引用,“y”是包含对数组的引用的视图。当“x”消失时,“y”中的某个位置仍然存在引用。该数组直到其引用计数为零才被释放,但事实并非如此。但是,如果“y”超出范围,视图将被释放,这将允许释放数组。 (2认同)