找出有序数组中相邻浮点数之间的最大差异

时间:2014-12-10 17:18:46

标签: python arrays performance numpy

说我有一个有序的数组/列表,如下所示:

a = [0.2, 0.35, 0.88, 1.2, 1.33, 1.87, 2.64, 2.71, 3.02]

我希望有效地找到相邻元素之间的最大差异。在这种情况下,它将是(2.64 - 1.87) = 0.77

我可以使用for循环,但我想知道是否有更优雅/更有效的解决方案。欢迎使用numpy的解决方案。


TEST

好的,我拿了所有的答案并测试了它们(见底部的代码)。这些是几秒钟内的结果:

0.0867638587952 0.118239144757 mark
0.00386190414429 0.118239144757 Padraic
0.00108003616333 0.118239144757 mtrw
0.0790281295776 0.118239144757 yurib
0.000712156295776 0.118239144757 elyase

这意味着 elyase 是几个数量级的赢家。谢谢大家!


MWE:

import numpy as np
import time

a = np.sort(np.random.uniform(0., 1000., 100000))

tik = time.time()
val = max(y - x for x,y in zip(a, a[1:]))
print time.time() - tik, val, 'mark'

tik = time.time()
val = np.ediff1d(a).max()
print time.time() - tik, val, 'Padraic'

tik = time.time()
val = np.max(np.abs(np.diff(a)))
print time.time() - tik, val, 'mtrw'

tik = time.time()
val = max(a[i+1]-a[i] for i in range(len(a)-1))
print time.time() - tik, val, 'yurib'

tik = time.time()
val = np.diff(a).max()
print time.time() - tik, val, 'elyase'

4 个答案:

答案 0 :(得分:2)

我无法宣称它更高效或更优雅,但它有所不同:

>>> max(y - x for x,y in zip(a, a[1:]))
0.77

答案 1 :(得分:2)

如果我们想对性能有点疯狂,我们可以使用numba

import numba

@autojit
def max_consecutive_diff(x):
    prev = x[0]
    diff_max = 0.0

    for i in range(1, len(x)):
        cur = x[i]
        diff = cur - prev

        if diff > diff_max:
            diff_max = diff

        prev = cur

    return diff_max

这是速度测试。使用

生成数据
>>> x = np.sort(np.random.sample(1e7))

我们得到:

>>> %timeit max_consecutive_diff(x)
100 loops, best of 3: 11.9 ms per loop

>>> %timeit np.max(np.diff(x))
10 loops, best of 3: 33.9 ms per loop

当然,千万长输入数组的毫秒。我只是坚持np.diff解决方案,但看看numba能做得多好总是很酷。

答案 2 :(得分:1)

max(a[i+1]-a[i] for i in range(len(a)-1))

答案 3 :(得分:1)

a = [0.2, 0.35, 0.88, 1.2, 1.33, 1.87, 2.64, 2.71, 3.02]

import numpy as np
print(np.ediff1d(a).max())
0.77

diffediff1d之间的区别是ediff1d在比较之前会变平:

In [18]: y = [[1, 2, 4], [1, 6, 24]]

In [19]: print(np.ediff1d(y))
[ 1  2 -3  5 18]

In [20]: print(np.diff(y))
[[ 1  2]
 [ 5 18]]