【问题标题】:unlist the result of a np.linespace取消列出 np.linspace 的结果
【发布时间】:2017-10-21 16:43:29
【问题描述】:

我想得到以下内容:

>>> 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 链进行第二步?

【问题讨论】:

  • SInce l 有 100 个长度为 30 的数组,np.array(l) 是一个 (100,30) 数组。可以按原样使用,根据需要重新塑造、分解和/或变成列表。
  • 在我的时间测试中,生成 100 个数组需要的时间最多。不管你怎么做,将它们组装成一个列表只需要一小部分时间。

标签: python numpy


【解决方案1】:

既然您知道最终列表有 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()

【讨论】:

【解决方案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()

【讨论】:

    【解决方案3】:

    使用生成器表达式可能会更好,以避免列表推导式变得太大而无法迭代一次。然后你可以追加到非常便宜的列表。

    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
    

    【讨论】:

    • 你循环和list((np.linspace ...)一样。它将生成器理解转换为列表。如果是这样,为什么不使用列表推导?
    • @hpaulj 因为生成器一次吐出一个 linspace,而不是一次构建所有内容然后迭代它们。这个附加到现有列表中。
    • @hpaulj 尝试大量的数组/元素。并且 list((...)) 不平坦
    • 好的,你对l += x的使用等价于l.extend(x),其中[x for x in ...] l.append(x)操作。
    • @hpaulj 重点不是创建整个迭代器,而是允许惰性理解,这样只有结果列表 l 会变得更大。生成器根据需要一个一个地发出元素,而不是一次创建所有元素然后一个一个地发出它们。 stackoverflow.com/q/47789/4950339
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2021-11-16
    • 2010-12-30
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多