Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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_Arrays_Numpy - Fatal编程技术网

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)
。不过,我应该注意到,我没有太彻底地查看源代码。可在此处找到来源以供进一步检查: