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

1 投票
4 回答
4316 浏览
提问于 2025-04-17 00:29

也许这个问题很简单,但到目前为止我找不到任何相关的信息。为了在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会尝试创建一个浮点数数组。

撰写回答