我想得到以下内容:
>>> 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 :(得分: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