Создание массива numpy настраиваемых объектов дает ошибку "SystemError: возврат ошибки без исключения",

Я пытаюсь использовать numpy для хранения некоторых пользовательских объектов, которые я создал. Ниже приведен упрощенный вариант моей программы

import numpy as np

class Element:
    def __init__(self): pass

a = Element()
periodicTable = np.array(range(7*32)).reshape((7,32))
periodicTable[0][0] = a

Однако, когда я запускаю это, я получаю

Traceback (most recent call last):
  File "C:/Users/Dan/Desktop/a.py", line 9, in <module>
    periodicTable[0][0] = a
SystemError: error return without exception set

Я не совсем уверен, что я делаю неправильно - насколько я могу сказать, все, что я сделал, должно быть законным. Самое загадочное сообщение об ошибке не очень полезно - я считаю, что это проблема с numpy, но я не смог идентифицировать свою проблему.

Ответ 1

@user2357112 определил проблему: вы назначаете экземпляр Element массиву numpy, который содержит целые числа. Это то, что я получаю, когда я пытаюсь что-то подобное:

>>> import numpy as np
>>> np.__version__
'1.7.1'
>>> p = np.array([1,2,3])
>>> class Foo:
...     pass
... 
>>> p[0] = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: error return without exception set
>>> 

Неудивительно, что это запрещено. Однако критическое сообщение об ошибке почти наверняка представляет собой многократную ошибку.

Один из способов устранить проблему - использовать массив типа object. Измените эту строку:

    periodicTable = np.array(range(7*32)).reshape((7,32))

:

    periodicTable = np.empty((7,32), dtype=object)

Update

В numpy 1.10.1 сообщение об ошибке все еще немного загадочно:

>>> import numpy as np
>>> np.__version__
'1.10.1'    
>>> p = np.array([1, 2, 3])
>>> class Foo:
...     pass
...  
>>> p[0] = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Foo instance has no attribute '__trunc__'

Обновление 2 Сообщение об ошибке лучше:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.12.1'

In [3]: class Foo:
   ...:     pass
   ...: 

In [4]: p = np.array([1, 2, 3])

In [5]: p[0] = Foo()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-739d5e5f795b> in <module>()
----> 1 p[0] = Foo()

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Foo'