【问题标题】:More efficient way to remove last N values fom np.array从 np.array 中删除最后 N 个值的更有效方法
【发布时间】:2016-07-28 13:34:06
【问题描述】:

我正在使用 np.arrays。我正在尝试删除最后 n 个元素,其中 n 也可以是 1。

n=5
corr=np.full(10,10)

通常我将这种方法与数组切片一起使用:

corr=corr[:-n]

但我正在考虑使用 np.delete 来提高性能:

np.delete(corr,range(-n,0))

但它不起作用,有没有比数组切片更好的解决方案? (能够处理 n=0 的情况的方法将是一个优势)

【问题讨论】:

  • 您想要view 还是copy
  • np.delete 分配一个新数组,这很可能比切片慢(你也需要为它提供正索引,所以 range(5, 10) 或其他东西)是的... np.delete比切片慢很多数量级。
  • delete 不会就地运行。它返回一个新数组。
  • @hpaulj 我需要一个修改后的数组....

标签: python arrays numpy


【解决方案1】:

使用corr[0:corr.size-n]。这是更快的方法,因为它只是一个视图。 np.delete 是剩余元素的副本。

In [9]: %timeit corr[0:corr.size-5]
1000000 loops, best of 3: 1.45 µs per loop

In [10]: %timeit np.delete(corr,range(corr.size-5,corr.size)) 
10000 loops, best of 3: 145 µs per loop

【讨论】:

    【解决方案2】:

    数组是具有shapedtype 和数据缓冲区等属性的对象。像A[:-5] 这样的视图是另一个数组,它有自己的shape 等,但有一个共享的数据缓冲区。它正在查看相同的数据,但只看到一个切片。

    A[:-5].copy() 看起来是一样的,但会有自己的数据缓冲区,即来自A 的选定元素的副本。

    无法更改A 的数据缓冲区大小。

    np.delete 返回一个带有自己数据缓冲区的新数组。它根据形状和删除模式使用各种方法。在所有情况下,它都是一个副本,并且比切片慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多