2

我正在尝试开发一个充当列表列表的类。我需要它在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。

可以在这里找到类似的问题

4

1 回答 1

1

根据文档,它看起来像是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给构造函数,那么我只会使用工厂函数。但我假设您的真实代码中还有更多内容。

于 2017-12-10T07:06:41.463 回答