Python:在FOR循环中向数组添加函数

时间:2011-08-28 16:47:05

标签: python arrays function metaprogramming

也许这是一个简单的问题,但到目前为止我找不到任何有关它的信息。 对于numpy中的优化,我需要一系列函数。我需要的函数数量取决于当前要优化的对象。 我已经想出了如何动态创建这些函数,但现在我想将它们存储在这样的数组中:

myArray = zeros(x)   
for i in range(x):
  myArray[i] = createFunction(i)

如果我运行这个,我会遇到类型不匹配:     float()参数必须是字符串或数字,而不是'function'

直接创建数组效果很好:

  myArray = array([createFunction(0)...])

但是因为我不知道我需要的功能数量,这正是我想要阻止的。

4 个答案:

答案 0 :(得分:2)

啊,我明白了。你的确意味着一系列函数

出现类型不匹配错误,因为默认情况下对zeros的调用会创建一个浮点数组。因此,如果您执行了myArray = numpy.empty(x, dtype=numpy.object),那么您的原文将有效(请注意emptyzeros更有意义)。稍微更加pythonic的版本是使用列表理解

myArray = numpy.array([createFunction(i) for i in range(x)]).

但你可能根本不需要创建一个numpy数组,具体取决于你想用它做什么:

myArray = [createFunction(i) for i in range(x)]

如果您想避开该列表,最好将numpy.fromfunctionnumpy.vectorize一起使用:

myArray = numpy.fromfunction(numpy.vectorize(createFunction), 
                             shape=(x,), dtype=numpy.object)

其中(x,)是一个给出数组形状的元组。需要调用vectorize,因为fromfunction假定函数可以对输入数组起作用并返回标量数组,vectorize转换函数来完成该操作。需要dtype=object,否则numpy会尝试创建一个浮点数组。

答案 1 :(得分:1)

也许你可以使用

myArray = array([createFunction(i) for i in range(x)])

答案 2 :(得分:1)

如果您需要一系列功能,是否可以使用NumPy? NumPy数组具有C风格类型,默认为浮点数。如果可以,只需使用标准的Python列表即可。但如果您绝对必须使用NumPy,请尝试像这样定义数组:

import numpy as np
a = np.empty([x], dtype=np.dtype(np.object_))

或者您需要使用 dtype

答案 3 :(得分:1)

Numpy数组是同质的。这就是numpy数组的所有元素属于同一类型 - python是duck-typed,numpy则不是。这是使numpy数组和矩阵上的矩阵运算如此之快的部分原因。但是,因此,首次创建阵列时必须知道数据类型。 Numpy通常非常擅长推断数据类型。创建空数组或清零数组时会出现问题。由于没有要检查的元素numpy必须猜测数据类型。如果在阵列创建时没有给出数据类型,Numpy默认为numpy.float64。这是一个不错的选择,因为numpy通常用于需要浮点数的科学或工程领域。这也是numpy抱怨的原因 - 因为它不能将你的函数存储为64位浮点数。

快速解决方案是让numpy知道您想要的数据类型。例如

myArray = numpy.zeros(x, dtype=numpy.object)

请注意,数据类型不能是任何类,但必须是numpy.dtype的实例(对于高级用法,您可以创建其他dtypes运行时numpy然后可以操作)。对于函数,numpy会将它们存储为numpy.object(这意味着任何通用的python对象)。我不认为使用numpy存储函数数组会获得任何性能优势。也许您最好创建生成器函数并将它们链接起来,一旦您知道结果将是一个数字,就转换为numpy数组。

funcs = [createFunction(i) for i in xrange(x)]

def getItemFromEachFunction(i):
    return funcs[i]()

arr = numpy.fromfunction(getItemFromEachFunction, (x,))