【问题标题】:How to "simulate" numpy.delete during processing如何在处理过程中“模拟”numpy.delete
【发布时间】:2014-09-04 03:29:54
【问题描述】:

为了加快我的算法的速度,这个算法有数万个元素的numpy数组,我想知道我是否可以减少numpy.delete()使用的时间。

事实上,如果我可以消除它呢? 我有一个算法,其中有我的数组alpha。 这就是我目前正在做的事情:

alpha = np.delete(alpha, 0)
beta = sum(alpha)

但是为什么我需要删除第一个元素呢?是否可以使用除第一个元素之外的所有元素简单地总结整个数组?这会减少删除操作所用的时间吗?

【问题讨论】:

    标签: python arrays optimization numpy


    【解决方案1】:

    尽可能避免使用np.delete。它returns a a new array,这意味着必须分配新内存,并且(几乎)所有原始数据都必须复制到新数组中。这很慢,所以尽可能避免它。

    beta = alpha[1:].sum()
    

    应该更快。

    还要注意sum(alpha) 正在调用Python builtin function sum。这不是对 NumPy 数组中的项目求和的最快方法。

    alpha[1:].sum() 调用 NumPy array method sum 更快。


    请注意,如果您在循环中调用alpha.delete,则代码可能会删除原始alpha 中的第一个元素。在这种情况下,正如 Sven Marnach 指出的那样,像这样计算所有部分和会更有效:

    np.cumsum(alpha[:0:-1])[::-1]
    

    【讨论】:

    • 谢谢。不过,我实际上并没有使用 sum,我只是将其用于演示任何数组计算。在我的代码中,我实际上使用的是 logsumexp() (来自 scipy 库)。你碰巧知道这个吗? stackoverflow.com/questions/25651480/…
    • 每次迭代对 alpha[idx:] 求和是相当低效的,因为你一遍又一遍地对数组的整个尾部求和。您可以通过使用(线性时间)numpy.cumsum(alpha[::-1])[::-1] 来避免这种情况,它可以一步计算从末尾开始的累积总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多