Python 将NumPy数组调整为较小的大小而不复制
当我使用Python 将NumPy数组调整为较小的大小而不复制,python,arrays,numpy,Python,Arrays,Numpy,当我使用resize方法收缩numpy数组时(即,数组由于resize而变小),是否保证不复制 例如: 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]) 根据我的理解,这在不复制的情况下应该始终是可能的。我的问题是:实施是否确实保证了情况始终如此?不幸的是,的文档对此一无所知。numpy数组在后台是一
resize
方法收缩numpy数组时(即,数组由于resize
而变小),是否保证不复制
例如:
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])
根据我的理解,这在不复制的情况下应该始终是可能的。我的问题是:实施是否确实保证了情况始终如此?不幸的是,的文档对此一无所知。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])
如果您的新大小总是会变小,为什么不将数组切片并分配回您自己呢?@EdChum:您的意思是
a=a[:5]
?老实说,我没有想到这个选择。不过,我不知道切片在内部是如何工作的。如果没有在某处制作数据的副本,这会起作用吗?谢谢,我真的不知道我可以使用切片来实现这一点。但是,这有一个警告:未使用的a
部分的内存没有释放(在某些情况下可能会出现问题)。如果我删除a,会发生什么?它会保留完整的数据还是足够聪明,只保留可通过b
访问的部分?当执行dela
时,它会完全保留a
,因为它仍然存在<代码>b仅显示a
的一小部分,但它仍在那里。真正释放内存的唯一方法是将其复制到新数组并删除旧数组。在背景中,numpy在创建/删除数组时只会执行标准的malloc
/释放
,而在c中不可能释放
数组的一部分。还有一个问题:调整大小
为什么在收缩数组时必须复制?我不是内存分配工作的专家,但如果不复制任何内容,就可以释放分配内存的最后面部分并保留前面部分,这难道不可能吗?下面是一些关于后台工作的解释:@Mr.F:正确,但据我所知,仅当简单地更改形状(而不是大小)时才起作用数组的一部分。例如,从(4,1)
调整到(2,2)
或(1,4)
。不过,我应该注意到,我没有太彻底地查看源代码。可在此处找到来源以供进一步检查: