2012-12-14 34 views
2

有没有比使用numpy.asarray()list的形式从输出生成数组更有效的方法?从列表理解输出中有效地生成numpy数组?

这似乎是在复制内存中的所有内容,这似乎并不像对于非常大的数组那样高效。

(更新)例:

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

您的示例似乎没有太大意义。除非'element'大于'a1'中的所有元素,否则它只是'a1'中最大的元素。在任何情况下,这种方法都会使这种函数的大a1变得非常糟糕,那么你究竟在做什么? 'np.frompyfunc'也不会真的加快速度。请注意,与实际完成的工作相比,这里的复制应该是非常不重要的,试图在不知道您的时间花在哪里通常是一个坏主意的情况下优化事情...... – seberg

+0

这仅仅是为了演示。我想要做的是创建符合某些条件的值的数组,以抵抗另一个数组中的一组值。你关于优化的观点是一个很好的观点。我只是好奇地想在这个例子中找到*最佳做法*。谢谢! – ryanjdillon

回答

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

np.vectorize将无法​​正常工作,你所希望的方式,因为它不尊重的out参数。然而,np.frompyfunc下级会:

np.frompyfunc(lambda element: np.amax(np.where(a1 > element)), 
       1, 1)(a2, out=np.empty_like(a2)) 
+0

我没有听说过'frompyfunc'。这看起来不错。谢谢! – ryanjdillon