Python 具有相同变量名的Numpy数组切片
当我们对原始numpy数组进行切片并将其设置为同一变量时,它会发生什么变化Python 具有相同变量名的Numpy数组切片,python,numpy,memory-management,Python,Numpy,Memory Management,当我们对原始numpy数组进行切片并将其设置为同一变量时,它会发生什么变化 >>> a = np.arange(15).reshape([3,5]) >>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> a = a[2:,:] >>> a array([[10, 11, 12, 13
>>> a = np.arange(15).reshape([3,5])
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a = a[2:,:]
>>> a
array([[10, 11, 12, 13, 14]])
原来的a数组发生了什么,是垃圾收集的吗?但是,我们需要引用原始数组,所以它存储在哪里
In [69]: a=np.arange(15).reshape(3,5)
数组具有base
属性;在这种情况下,它引用1d arange:
In [70]: a.base
Out[70]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In [71]: a = a[2:,:]
In [72]: a
Out[72]: array([[10, 11, 12, 13, 14]])
同样的基础。(3,5)视图不可用:
In [73]: a.base
Out[73]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
但如果二维阵列是副本,而不仅仅是视图:
In [74]: a=np.arange(15).reshape(3,5).copy()
In [75]: a.base
In [76]: a = a[2:,:]
In [77]: a.base
Out[77]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
与任何其他python对象一样,数组对象本身将少一个引用。如果这是对该对象的唯一引用,则该对象可以自由地进行垃圾收集。在CPython中(特别是当您使用
numpy
),当ref计数达到0时,它会立即被回收。注意,底层缓冲区没有被释放,因为数组切片在底层缓冲区上创建视图。如果需要原始数组,为什么要再次将结果分配给a
?只是b=a[2:,:]
你既有原始的,也有结果?是的,如果没有对原始数组的进一步引用,它将被垃圾收集(在本例中,这意味着它将提供视图-@juan.arrivillaga提出了一个重要的观点)。是的,我是出于好奇才这样问的。你所说的底层缓冲区是什么意思?cpython分配的内存位置是否仍然充满了数据?例如,RAM中的空间是否仍被占用?拷贝与将数组存储在base
属性中有什么关系?在第75行中,我们为什么看不到任何输出?a.base
是None
-它不是派生数组。它有自己的数据缓冲区(由于复制)。