2013-12-09 17 views
11

Sto cercando di usare numpy per memorizzare alcuni oggetti personalizzati che ho creato. Quanto segue è una versione semplificata del mio programmaCreazione di array numpy di oggetti personalizzati dà errore "SystemError: errore restituito senza eccezione impostata"

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 

Tuttavia quando ho eseguito questo ho

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 

Io non sono davvero sicuro di quello che sto facendo male - per quanto posso dire tutto Ho fatto dovrebbe essere legale. Il messaggio di errore criptico in sé non è molto utile - credo che sia un problema intorpidito, ma non sono stato in grado di identificare il mio problema.

+2

non una soluzione al vostro problema, ma perché stai cercando di attaccare oggetti Python arbitrari in un array di DTYPE 'int32'? Inoltre, se vuoi generare una matrice vuota, ci sono 'numpy.zeros',' ones' o 'empty'. Non è necessario creare un elenco Python con 'range' per inizializzarlo. – user2357112

risposta

8

@ user2357112 ha identificato il problema: si assegna un'istanza Element a una matrice numpy che contiene numeri interi. Questo è quello che ottengo quando provo qualcosa di simile:

>>> 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 
>>> 

Non è sorprendente che questo non è consentito. Il criptico messaggio d'errore, tuttavia, è quasi certamente un insetto insensato.

Un modo per risolvere il problema è utilizzare un array di tipo object. Modificare questa linea:

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

a questo:

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

Aggiornamento

In numpy 1.10.1, il messaggio di errore è ancora un po 'criptico:

>>> 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__' 

messaggio Update 2 L'errore è meglio:

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' 
Problemi correlati