Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有相同变量名的Numpy数组切片_Python_Numpy_Memory Management - Fatal编程技术网

Python 具有相同变量名的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

当我们对原始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, 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
-它不是派生数组。它有自己的数据缓冲区(由于复制)。