を使用して次のことを効率的に表現するにはどうすればよいnumexpr
ですか?
z = min(x-y, 1.0) / (x+y)
x
とy
は、同じ形状のいくつかの大きな NumPy 配列です。
つまり、で割る前ににキャップしようとしx-y
ています。1.0
x+y
私は単一のnumexpr
式を使用してこれを行いたいと思います(x
そしてy
巨大であり、それらを複数回反復する必要はありません)。
たぶん、このようなものがうまくいくでしょうか?
In [11]: import numpy as np
In [12]: import numexpr as ne
In [13]:
In [13]: x = np.linspace(0.02, 5.0, 1e7)
In [14]: y = np.sin(x)
In [15]:
In [15]: timeit z0 = ((x-y) - ((x-y) > 1) * (x-y - 1))/(x+y)
1 loops, best of 3: 1.02 s per loop
In [16]: timeit z1 = ne.evaluate("((x-y) - ((x-y) > 1.) * ((x-y) - 1.))/(x+y)")
10 loops, best of 3: 120 ms per loop
In [17]: timeit z2 = ne.evaluate("((x-y)/(x+y))")
10 loops, best of 3: 103 ms per loop
ディビジョンを超えるキャッピングにはペナルティがありますが、それほど悪くはありません。残念ながら、いくつかのより大きな配列で試したところ、セグメンテーション違反が発生しました。:-/
更新:これははるかにきれいで、少し高速です:
In [40]: timeit w0 = ne.evaluate("where(x-y>1,1,x-y)/(x+y)")
10 loops, best of 3: 114 ms per loop