2

有没有比使用numpy.asarray()以 a 形式从输出生成数组更有效的方法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.vectorize不会按照您想要的方式工作,因为它不尊重out参数。但是,较低级别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 回答