Python:在FOR循环中向数组添加函数
也许这个问题很简单,但到目前为止我找不到任何相关的信息。为了在numpy
中进行优化,我需要一个函数的数组。所需的函数数量取决于当前要优化的对象。
我已经搞清楚了如何动态创建这些函数,但现在我想把它们存储在一个数组里,像这样:
myArray = zeros(x)
for i in range(x):
myArray[i] = createFunction(i)
但是如果我运行这个,就会出现类型不匹配的错误:
float() 的参数必须是字符串或数字,而不是 'function'。
直接创建数组是可以的:
myArray = array([createFunction(0)...])
但是因为我不知道需要多少个函数,所以我正想避免这种情况。
4 个回答
1
如果你需要一个函数的数组,可以不使用NumPy吗?NumPy的数组有点像C语言的类型,默认是浮点数。如果可以的话,直接用普通的Python列表就行了。不过如果你一定要用NumPy,可以试着这样定义数组:
import numpy as np
a = np.empty([x], dtype=np.dtype(np.object_))
或者根据你的需要,使用那个 dtype
。
1
也许你可以使用
myArray = array([createFunction(i) for i in range(x)])
3
哦,我明白了。你确实是想要一个包含函数的数组。
出现类型不匹配的错误是因为调用zeros
默认会创建一个浮点数的数组。所以如果你想让原来的代码正常工作,可以改成myArray = numpy.empty(x, dtype=numpy.object)
(这里用empty
比用zeros
更合适)。如果想用更符合Python风格的写法,可以使用列表推导式。
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会尝试创建一个浮点数数组。