减少数组拆分时内存使用的最佳实践

3

我有一个数组,想要将其分成两半。因为对称性的原因,我只关心保留数组的左半部分。

我可以通过以下代码将数组分成两半:

[a,b] = numpy.split(c,2)

c也是一个数组。

有没有办法只返回“a”数组,或者在拆分数组后立即从内存中删除“b”数组?

3个回答

4
您可以使用以下方式复制前半部分:
a = x[len(x)//2:].copy()

这需要分配副本并移动内容(因此暂时需要1.5倍的内存)。

否则,您只需说

a = x[len(x)//2:]

为了获取第一个部分的引用,但不会将另一部分从内存中删除。

0

你可以简单地使用delete函数来实现这个目的!以下是一个例子:

array=np.array([1,2,3,4])
x=len(array)/2
first_h=np.delete(array,array[x-1:])         #second half

演示:

>>>print first_h
>>>[1,2]

这个问题涉及到Numpy的“数组”,它们没有“remove”方法。你的答案只适用于Python的“列表”。 - Bas Swinckels
是的,谢谢提醒!我一直想知道为什么我失去了赞成票!现在我知道了!谢谢!我会编辑答案的! - Mazdak
不确定这是否有效。在对numpy数组进行切片时,您不会创建副本,而是创建一个“视图”到原始数组中,即使您删除原始数组,它也会保持大块内存的活动状态。关于np.delete的文档没有提供太多信息,但我猜想像@6502的答案一样明确地复制原始数组以便释放原始数组可能是正确的方法。 - Bas Swinckels
在scipy文档中,我们可以看到delete函数的输出是一个ndarray,它是arr的副本,其中obj指定的元素已被删除。请注意,delete不会就地进行。如果axis为None,则输出是一个扁平化的数组。http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html - Mazdak

0

我不确定,但我认为这是最好的,因为它依赖于list的实现(docs),而且我相信它已经正确完成:

>>> r = range(10)
>>> r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del r[5:]
>>> r
[0, 1, 2, 3, 4]

另请参阅列表的del语句


1
这个问题是关于Numpy的“数组”,而不是Python的“列表”。 - Bas Swinckels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接