11

純粋なpythonで平均速度を計算するアルゴリズムがあります:

speed = [...]
avg_speed = 0.0
speed_count = 0

for i in speed:
    if i > 0: # I dont need zeros
        avg_speed += i
        speed_count += 1

if speed_count == 0:
    return 0.0

return avg_speed / speed_count

この関数を Numpy で書き直す方法はありますか?

4

5 に答える 5

28

関数は引数numpy.averageを受け取ることweightsができ、配列自体に適用された条件から生成されたブール配列を配置できます。この場合、要素は 0 より大きい:

average_speed = numpy.average(speeds, weights=(speeds > 0))

お役に立てれば

于 2012-06-18T14:45:41.217 に答える
27

誰も最短の解決策を提案していないことに驚いています:

speeds_np = np.array(speeds)

speeds_np[speeds_np>0].mean()

説明:

speedsNp > 0(不)等式を満たす同じサイズのブール配列を作成します。に入力すると、ブール配列の値が である場所のspeedsNp対応する値のみが生成されます。あとは、結果を取得するだけです。speedNpTruemean()

于 2015-07-09T08:41:07.907 に答える
10
import numpy as np

def avg_positive_speed(speed):
    s = np.array(speed)
    positives = s > 0
    if positives.any():
        return s[positives].mean()
    else:
        return 0.


speed = [1., 2., 0., 3.]
print avg_positive_speed(speed)
# prints 2.0

print avg_positive_speed([0., 0.])
# prints 0.0
于 2012-06-18T14:14:41.603 に答える
3

私はあなたがnumpy解決策を望んでいることを知っているので、これはその基準を満たしていません (@eumiro の以前の投稿は確かにそうです) が、別の方法として、ここに最適化された Python バージョンがあります。

speeds = [i for i in speed if i > 0]
return  sum(speeds) / (1.0 * len(speeds)) if sum(speeds) > 0 else 0.0

これを numpy (または元の) 実装と速度の点で比較すると興味深いかもしれません。

In [14]: timeit original(speed)              # original code
1000 loops, best of 3: 1.13 ms per loop

In [15]: timeit python_opt(speed)            # above Python 2 liner
1000 loops, best of 3: 582 us per loop

In [16]: timeit avg_positive_speed(speed)    # numpy code
1000 loops, best of 3: 1.2 ms per loop

どこ

speed = range(10000)

私はそれがここで優位に立つと思っていたnumpyだろう..なぜそれが後を引くのか誰か知っている?

アップデート:

speed = range(100000):

In [19]: timeit original(speed)
100 loops, best of 3: 12.2 ms per loop

In [20]: timeit python_opt(speed)
100 loops, best of 3: 11 ms per loop

In [21]: timeit avg_positive_speed(speed)
100 loops, best of 3: 12.5 ms per loop

膨大な数の速度がない限り、この特定の問題numpyに対する優れたツールであるとはまだ確信していません:)

numpy はメモリをどのように処理しますか? リストの理解は、ある時点でいくつかの制限にぶつかります。

于 2012-06-18T14:16:14.027 に答える