在我目前的工作中,我经常使用 Numpy 和列表推导式,为了获得最佳性能,我有以下问题:
如果我按如下方式创建 Numpy 数组,幕后实际会发生什么?
a = numpy.array( [1,2,3,4] )
我的猜测是python首先创建一个包含值的普通列表,然后使用列表大小分配一个numpy数组,然后将值复制到这个新数组中。这是正确的,还是解释器足够聪明地意识到列表只是中间值,而是直接复制值?
同样,如果我希望使用 numpy.fromiter()
从列表理解创建一个 numpy 数组:
a = numpy.fromiter( [ x for x in xrange(0,4) ], int )
这会导致在输入 fromiter()
之前创建一个中间值列表吗?
最佳答案
我相信您正在寻找的答案是使用 generator expressions
与 numpy.fromiter .
numpy.fromiter((<some_func>(x) for x in <something>),<dtype>,<size of something>)
生成器表达式是惰性的 - 当您遍历它们时,它们会计算表达式。
使用列表推导生成列表,然后将其输入 numpy,而生成器表达式将一次生成一个。
Python 像大多数语言(如果不是全部的话)一样,从内到外评估事物,所以使用 [<something> for <something_else> in <something_different>]
将创建列表,然后对其进行迭代。
关于python - 从列表理解和一般情况下有效地创建 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372613/