也许这是一个简单的问题,但到目前为止我找不到任何有关它的信息。
对于numpy
中的优化,我需要一系列函数。我需要的函数数量取决于当前要优化的对象。
我已经想出了如何动态创建这些函数,但现在我想将它们存储在这样的数组中:
myArray = zeros(x)
for i in range(x):
myArray[i] = createFunction(i)
如果我运行这个,我会遇到类型不匹配: float()参数必须是字符串或数字,而不是'function'
直接创建数组效果很好:
myArray = array([createFunction(0)...])
但是因为我不知道我需要的功能数量,这正是我想要阻止的。
答案 0 :(得分:2)
啊,我明白了。你的确意味着一系列函数。
出现类型不匹配错误,因为默认情况下对zeros
的调用会创建一个浮点数组。因此,如果您执行了myArray = numpy.empty(x, dtype=numpy.object)
,那么您的原文将有效(请注意empty
比zeros
更有意义)。稍微更加pythonic的版本是使用列表理解
myArray = numpy.array([createFunction(i) for i in range(x)]).
但你可能根本不需要创建一个numpy数组,具体取决于你想用它做什么:
myArray = [createFunction(i) for i in range(x)]
如果您想避开该列表,最好将numpy.fromfunction
与numpy.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,))