2017-10-21 25 views
1

的结果,我想获得如下:不公开一个np.linespace

>>> import numpy as np 
>>> import itertools 
>>> a1 = np.random.randn(100) 
>>> a2 = np.random.randn(100) 
>>> l = [np.linspace(start=np.asscalar(min(a1[i],a2[i])), stop=np.asscalar(max(a1[i],a2[i])), num=30) for i in range(len(a1))] 

然而,在l元素现在阵列。我想要一份浮标清单。如果我做

l = [np.linspace(start=np.asscalar(min(a1[i],a2[i])), stop=np.asscalar(max(a1[i],a2[i])), num=30).tolist() for i in range(len(a1))] 

我得到一个列表的列表,所以我需要通过

>>> list(chain.from_iterable(l)) 

的名单上有相当大的解包内一个让我想获得正确的结果从一开始就。有没有办法通过itertools链来实现或者是第二步?

+0

因为'l'有100个长度为30的数组,'np.array(l)'是一个(100,30)数组。这可以按原样使用,根据需要重新塑造,缩小和/或变成列表。 – hpaulj

+0

在我的时间测试中,生成100个阵列需要大部分时间。不管你是怎么做的,将它们组装成一个列表占用了总时间的一小部分。 – hpaulj

回答

3

你既然知道,那你的最终名单有100点* 30点的值,可以生成尺寸正确第一手的numpy.array:

import numpy as np 
a1 = np.random.randn(100) 
a2 = np.random.randn(100) 
start = np.minimum(a1, a2)[:, None] 
stop = np.maximum(a1, a2)[:, None] 
values = (np.linspace(0,1,30)[None, :] * (stop-start) + start).ravel() 
+0

这种扩展一个空间的方法在https://stackoverflow.com/questions/46694167/vectorized-numpy-linspace-across-multi-dimensional-arrays – hpaulj

2

不是最优雅的答案,但由于您已经在使用numpy,因此您可以将列表理解转换为数组,然后将其列为一个列表。从您的代码借用,它应该是这样的:

l = np.array([np.linspace(start=np.asscalar(min(a1[i],a2[i])), stop=np.asscalar(max(a1[i],a2[i])), num=30) for i in range(len(a1))]).flatten().tolist() 
0

用生成器表达式可能会更好,以避免列表理解变得太大而仅仅迭代一次。然后你可以附加列表,这是很便宜的。

l = [] 
for x in (np.linspace(start=min(a1[i],a2[i]), stop=max(a1[i],a2[i]), 
         num=30).tolist() for i in range(len(a1))): 
    l += x 
+0

中提倡,你的循环和list((np.linspace)一样。如果是这样,为什么不使用列表理解呢? – hpaulj

+0

@hpaulj Becaue生成器一次一个地吐出一个空间,而不是一次构建所有东西,然后迭代它们。 – percusse

+0

最终结果是一样的,构造了许多数组 – hpaulj