从列表理解和in-gen高效创建numpy数组

2024-06-24 12:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在我目前的工作中,我经常使用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()之前创建一个中间值列表吗?

致意 尼尔斯


Tags: innumpy列表for数组性能array解释器
2条回答

我相信你要找的答案是使用generator expressionsnumpy.fromiter

numpy.fromiter((<some_func>(x) for x in <something>),<dtype>,<size of something>)

生成器表达式很懒-当您遍历它们时,它们会计算表达式的值。

使用列表理解生成列表,然后将其馈送到numpy中,而生成器表达式将一次生成一个。

Python像大多数语言(如果不是全部的话)一样,对内部和外部进行求值,因此使用[<something> for <something_else> in <something_different>]可以生成列表,然后对其进行迭代。

你可以创建自己的列表,并用它进行实验,以了解情况。。。

>>> class my_list(list):
...     def __init__(self, arg):
...         print 'spam'
...         super(my_list, self).__init__(arg)
...   def __len__(self):
...       print 'eggs'
...       return super(my_list, self).__len__()
... 
>>> x = my_list([0,1,2,3])
spam
>>> len(x)
eggs
4
>>> import numpy as np
>>> np.array(x)
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])
>>> np.fromiter(x, int)
array([0, 1, 2, 3])
>>> np.array(my_list([0,1,2,3]))
spam
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])

相关问题 更多 >