取消np.linespace的结果

时间:2017-10-21 16:43:30

标签: python numpy

我想得到以下内容:

>>> 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链的第二步必要?

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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()

答案 2 :(得分: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