2

numpy.asarray()?の形式で出力から配列を生成するために使用するよりも効率的な方法はありlistますか?

これはメモリ内のすべてをコピーしているように見えますが、非常に大きなアレイではそれほど効率的ではないようです。

(更新)例:

import numpy as np
a1 = np.array([1,2,3,4,5,6,7,8,9,10]) # pretend this has thousands of elements
a2 = np.array([3,7,8])

results = np.asarray([np.amax(np.where(a1 > element)) for element in a2])
4

2 に答える 2

5

私は通常使用しますnp.fromiter

results = np.fromiter((np.amax(np.amax(np.where(a1 > element)) for element in a2), dtype=int, count=len(a2))

指定する必要はありませんがcount、numpy が配列を事前に割り当てることができます。https://www.pythonanywhere.com/try-ipython/で行ったいくつかのタイミングを次に示します。

In [8]: %timeit np.asarray([np.amax(np.where(a1 > element)) for element in a2])                                 
1000 loops, best of 3: 161 us per loop

In [10]: %timeit np.frompyfunc(lambda element: np.amax(np.where(a1 > element)),1,1)(a2,out=np.empty_like(a2))   
10000 loops, best of 3: 123 us per loop

In [13]: %timeit np.fromiter((np.amax(np.where(a1 > element)) for element in a2),dtype=int, count=len(a2))
10000 loops, best of 3: 111 us per loop
于 2012-12-14T18:20:17.897 に答える
1

np.vectorizeoutパラメータを尊重しないため、思い通りには機能しません。ただし、下位レベルnp.frompyfuncは次のようになります。

np.frompyfunc(lambda element: np.amax(np.where(a1 > element)),
              1, 1)(a2, out=np.empty_like(a2))
于 2012-12-14T11:58:14.840 に答える