【问题标题】:Best practice to reduce memory usage when splitting array拆分数组时减少内存使用的最佳实践
【发布时间】:2014-10-31 19:50:56
【问题描述】:

我有一个想要分成两半的数组。由于对称性,我只对保留数组的左半部分感兴趣。

我可以将数组分成两半:

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

其中 c 也是一个数组。

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

【问题讨论】:

    标签: python arrays memory numpy


    【解决方案1】:

    你可以复制前半部分

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

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

    否则你只能说

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

    获取前半部分的引用,但其他部分不会从内存中删除

    【讨论】:

      【解决方案2】:

      您只需使用 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 arrays,他没有 remove 方法。您的答案仅适用于 Python lists
      • 好的,谢谢提醒!我想知道为什么我失去了赞成票!现在我注意到了!谢谢 !我编辑答案!
      • 不确定这是否可行。切片为 numpy 数组时,您不会创建副本,而是在原始数组中创建一个“视图”,即使您删除了原始数组,也可以保持大块内存处于活动状态。关于np.delete 的文档对此并没有说太多,但我想制作一个明确的副本,以便可以像@6502 的答案那样释放原始数组。
      • 在 scipy doc 中,我们读到 delete 函数的输出是一个 ndarray 的 arr 副本,其中删除了 obj 指定的元素。请注意,删除不会就地发生。如果axis为None,则out是一个扁平数组。 docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html
      【解决方案3】:

      我不确定,但我认为这可能是最好的,因为它依赖于 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 statement for lists

      【讨论】:

      • 问题是关于 Numpy arrays,而不是关于 Python lists
      猜你喜欢
      • 2018-11-04
      • 2010-09-29
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多