获取Python中元素的连续比率

6
有没有一种简单的方法来获取numpy数组连续元素的比率?
基本上类似于 numpy.diff(x) 的东西?
所以如果 x=[1,2,10,100 ...],我想要 [0.5, 0.2, 0.1 ...],即 [x1/x2, x2/x3 , x3/x4]。
我知道我可以通过移位和除法轻松地完成这个操作,但与 numpy.diff(x) 相比,它似乎有些笨拙。

2
你不会得到比切片和分割更好的东西。 - user2357112
3个回答

13

使用numpy:

In [6]: x
Out[6]: array([   1.,    2.,   10.,  100.,  150.,   75.])

In [7]: x[:-1]/x[1:]
Out[7]: array([ 0.5       ,  0.2       ,  0.1       ,  0.66666667,  2.        ])

这可能是你说“我可以通过移位和除法轻松完成”的意思,但我没有看到任何笨拙的地方。


确实,x[:-1]/x[1:] 的语法非常优雅,没有任何笨拙之处! - shelbypereira

5

很不情愿地发出这篇文章,但是对于 x = [6, 2, 4, 10]

np.exp(-np.diff(np.log(x)))

返回结果为array([3. , 0.5, 0.4])


一个工作的一行代码。需要思考才能理解你在做什么,聪明的想法。@WarrenWeckesser更直观,但这绝对适合学习,因为它可以在不进行任何移位的情况下实现结果。 - shelbypereira
我要注意的是,这种方法比切片方法慢了大约7倍:counts = np.random.rand(109) + 1 import timerit ti = timerit.Timerit(10000, bestof=10, verbose=2) for timer in ti.reset('time'): ratios = counts[:-1] / counts[1:] for timer in ti.reset('time'): ratios = np.exp(-np.diff(np.log(counts))) - Erotemic
@Erotemic 我很惊讶它只出现了7次,考虑到explog的计算代价是多么昂贵。无论如何,我发这个帖子时甚至感到不忍。 - bers

0
xs = [1, 2, 10, 100, ...]
[x1/x2 for (x1, x2) in zip(xs, xs[1:])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接