2015-09-04 56 views
3

当我使用resize方法缩小numpy数组时(即数组因为resize而变小),是否保证不做复制?将NumPy数组的大小调整为较小的大小而无需复制

例子:

a = np.arange(10)   # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
a.resize(5, refcheck=False) # array([0, 1, 2, 3, 4]) 

从我的理解这应该是尽可能不进行复制。我的问题:这个实现是否确实确保这种情况总是如此?不幸的是,resize的文档没有提到它。

+1

如果您的新尺寸总是会更小,为什么不切片数组并分配给自己? – EdChum

+0

@EdChum:你的意思是'a = a [:5]'?说实话,我没有想到这个选择。不过,我不知道内部是如何切片的。这是否会在没有任何数据副本的情况下工作? – luator

回答

3

numpy数组在背景中是一个固定大小的数组,任何类型的大小总是会复制数组。如上所述,您可以仅使用数组的子集而无需调整大小/复制来有效地创建数组的片段。

>>> import numpy 
>>> a = numpy.arange(10) 
>>> b = a[:5] 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b 
array([0, 1, 2, 3, 4]) 
>>> 
>>> a += 10 
>>> a 
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 
>>> b 
array([10, 11, 12, 13, 14]) 
>>> 
>>> b += 10 
>>> a 
array([20, 21, 22, 23, 24, 15, 16, 17, 18, 19]) 
>>> b 
array([20, 21, 22, 23, 24]) 
+0

谢谢,我没有真正意识到我可以使用切片。然而,这有一个警告:对于'a'的未使用部分的内存没有被释放(在某些情况下这可能是个问题)。如果我做'del a'会怎么样?它会保留完整的数据还是足够聪明,只保留可通过'b'访问的部分? – luator

+1

当做'del a'时,它会完全保留'a',因为它仍然存在。 'b'只显示“a”的一小部分,但它仍然存在。实际释放内存的唯一方法是将其复制到一个新阵列并删除旧阵列。在后台numpy只是在创建/删除数组时创建一个标准的'malloc' /'free',并且不能'释放'c中的数组的一部分。 – Wolph

+0

另一个问题:为什么'resize'必须在缩小数组时进行复制?我不擅长内存分配的工作方式,但是不应该只释放分配内存的最后部分并保留前部分而不复制任何东西? – luator