我正在尝试开发一个行为列表列表的类。我需要它在deap框架中将它作为个人的类型传递。目前,我正在使用numpy对象数组。这是代码。
import numpy
class MyArray(numpy.ndarray):
def __init__(self, dim):
numpy.ndarray.__init__(dim, dtype=object)
但是当我尝试将值传递给MyArray
的对象时,
a = MyArray((2, 2))
a[0][0] = {'procID': 5}
我收到错误,
Traceback (most recent call last):
File "D:/PythonProjects/NSGA/src/test.py", line 23, in <module>
'procID': 5
TypeError: float() argument must be a string or a number, not 'dict'
欢迎任何建议。您还可以使用不同的方式向我展示,而不使用numpy,这有助于创建类型。
可以找到类似的问题here
答案 0 :(得分:1)
根据the documentation,看起来ndarray
使用__new__()
进行初始化,而不是__init__()
。特别是,在dtype
方法运行之前已经设置了数组的__init__()
,这是有道理的,因为ndarray
需要知道它的dtype
是什么来知道多少内存分配。 (内存分配与__new__()
相关联,而不是__init__()
。)因此,您需要覆盖__new__()
以向dtype
提供ndarray
参数。
class MyArray(numpy.ndarray):
def __new__(cls, dim):
return numpy.ndarray.__new__(cls, dim, dtype=object)
当然,您也可以 在您的课程中使用__init__()
方法。它将在__new__()
完成后运行,这将是设置其他属性的适当位置或您可能想要做的其他任何不必修改ndarray
构造函数的行为的地方
顺便说一下,如果您将ndarray
继承为子类的唯一原因是您可以将dtype=object
传递给构造函数,那么我只需使用工厂函数。但是我假设您的真实代码还有更多内容。