Объект Python как список списков словарей

Я пытаюсь разработать класс, который ведет себя как список списков. Мне нужно, чтобы он передавался как тип для человека в глубокой структуре. В настоящее время я работаю с массивом объектов 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, который облегчает создание типов.

Аналогичный вопрос можно найти здесь


person infiniator    schedule 10.12.2017    source источник
comment
Возможно, вам следует попробовать pandas для преобразования dict в эквивалент массива numpy.   -  person Bharath    schedule 10.12.2017
comment
Вы можете изучить один из способов, упомянутых здесь, и изменить часть инициализации в соответствии с вашей собственной логикой.   -  person Sohaib Farooqi    schedule 10.12.2017


Ответы (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 конструктору, я бы просто использовал вместо этого фабричную функцию. Но я предполагаю, что в вашем реальном коде есть нечто большее.

person David Z    schedule 10.12.2017