创建自定义对象的numpy数组时出现错误“SystemError:error return without exception set”

2024-04-19 20:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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

我真的不知道我做错了什么-我能告诉你我所做的一切都是合法的。这个神秘的错误消息本身并不是很有帮助-我相信这是一个棘手的问题,但是我一直无法确定我的问题。


Tags: 对象importself程序版本numpyinitdef
1条回答
网友
1楼 · 发布于 2024-04-19 20:09:01

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

不允许这样做并不奇怪。然而,这个神秘的错误消息几乎可以肯定是一个numpy错误。

解决此问题的一种方法是使用类型为object的数组。更改此行:

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

对此:

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

更新

在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

错误消息最好是更高版本的numpy:

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'

相关问题 更多 >