Skip to main content
 首页 » 编程设计

python之为什么当我尝试 reshape numpy 数组时 memmap 需要文件名

2024年08月29日37softidea

我得到了一个难以理解的堆栈跟踪:

screwed_up_code.py in atleast_4d(arr) 
     28 def atleast_4d(arr): 
     29     stshape = arr.shape 
     30     while len(stshape)<4: stshape+=(1,) 
     31     print arr.shape, stshape 
---> 32     return arr.reshape(stshape) 
 
/usr/lib/python2.7/dist-packages/numpy/core/memmap.pyc in __array_finalize__(self, obj) 
    255         if hasattr(obj, '_mmap'): 
    256             self._mmap = obj._mmap 
--> 257             self.filename = obj.filename 
    258             self.offset = obj.offset 
    259             self.mode = obj.mode 
 
AttributeError: 'memmap' object has no attribute 'filename' 

如果您想知道 arr.shape = (192, 384, 6) 和 stshape = (192, 384, 6, 1)


更新

根据 NPE 的建议,我调查了 the bug report of a similar sounding AttributeError .那里的一张海报将其归咎于由于 ndarray 的 pickle 而丢失的属性。我确实在 pickle 数组,当像这样重新激活加载的数组时:

newarr = numpy.ndarray(pickled_array) 
pickled_array = newarr                  # use the recreated instead of the pickled arr 

我收到警告而不是异常,我的代码运行了:

Exception AttributeError: AttributeError("'NoneType' object has no attribute 'tell'",) in  ignored 
Exception AttributeError: AttributeError("'NoneType' object has no attribute 'tell'",) in  ignored 
Exception AttributeError: AttributeError("'NoneType' object has no attribute 'tell'",) in <bound method memmap.__del__ of memmap([  85389.2734375,  125935.75     ,  173624.09375  ,  272958.78125  , 
        305687.65625  ,  433026.3125   ], dtype=float32)> ignored 

我很高兴我的代码可以运行并且暂时保留它。

请您参考如下方法:

这听起来与 this bug 非常相似.

stack trace有一点不同,但代码最终在完全相同的点失败并出现完全相同的异常:

 File "C:\Python26\Lib\site-packages\numpy\core\memmap.py", line 257, in __array_finalize__ 
   self.filename = obj.filename 
AttributeError: 'memmap' object has no attribute 'filename' 

numpy-discussion thread这是首次报告的地方表明该问题可能与 this other ticket 有关与 memmap 对象的 pickle 有关。无论如何,该线程值得一读。