是否有更有效的方法比使用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])
答案 0 :(得分: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
答案 1 :(得分:1)
np.vectorize
将无法按您所希望的方式运行,因为它不尊重out
参数。但是,较低级np.frompyfunc
将:
np.frompyfunc(lambda element: np.amax(np.where(a1 > element)),
1, 1)(a2, out=np.empty_like(a2))