【发布时间】:2016-08-14 04:24:39
【问题描述】:
我正在尝试使用 scipy.io.savemat() 函数保存矩阵。但是,我收到以下错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
这是我得到的完整错误:
scipy.io.savemat('path/to/file.mat',dict__)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio.py", line 207, in savemat
MW.put_variables(mdict)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 876, in put_variables
self._matrix_writer.write_top(var, asbytes(name), is_global)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 626, in write_top
self.write(arr)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 655, in write
self.write_cells(narr)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 759, in write_cells
self.write(el)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 655, in write
self.write_cells(narr)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 759, in write_cells
self.write(el)
.
.
.
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 759, in write_cells
self.write(el)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 655, in write
self.write_cells(narr)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 758, in write_cells
for el in A:
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 316, in __getitem__
out = N.ndarray.__getitem__(self, index)
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 292, in __array_finalize__
if (isinstance(obj, matrix) and obj._getitem): return
RuntimeError: maximum recursion depth exceeded while calling a Python object
我尝试使用sys.setrecursionlimit(10000) 增加递归限制,但它没有改变任何东西。我也尝试了resource.setrlimit() 修复,但也没有用。
有人知道这里有什么问题或为什么会这样吗?有没有办法解决这个错误? 在此先感谢您的帮助!
P.S:我在 Windows 和 Linux 上遇到此错误!
艾莉
【问题讨论】:
-
我的猜测是您在
dict__中有一个循环引用。如果没有看到您的代码,很难更具体。请发布minimal reproducible example,我们可以运行它来重现此错误。 -
@PM2Ring 抱歉,但我不明白循环引用是什么意思?字典包含程序创建的变量和数组。在我将 2 个数组添加到该字典(195x195)之前,一切正常。感谢您的回复!
-
我无法发布代码示例,因为它是机密的,我无法使用另一个脚本重现此错误。感谢您的帮助!
-
循环引用是当你有像集合 A 包含集合 B 作为元素,但集合 B 也包含集合 A 作为元素时。或者你可以有一个更长的链,比如 A 包含 B 包含 C 包含 A。等等。
-
你总是可以use a debugger。在致电
savemat之前放置import pdb; pdb.set_trace()。然后单步执行代码。在C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py第 655 行设置一个断点并调查为什么self.write_cells(narr)被无限调用(大概)。例如,使用p narr打印narr的值。检查那些narrs 是否符合您的期望。
标签: python python-2.7 recursion scipy runtime-error