说我有一个有序的数组/列表,如下所示:
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'
答案 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
diff
和ediff1d
之间的区别是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]]