2013-03-15 25 views
1

Python類我有一個下面的錯誤消息誤差在與不迭代對象

Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2721, in run_code 
    exec code_obj in self.user_global_ns, self.user_ns 
    File "<ipython-input-257-84ae6ec7b6f6>", line 1, in <module> 
    accuracy.ra_os 
    File "<ipython-input-255-a91d95432efe>", line 32, in ra_os 
    return np.average([(ref.intersection(s).area/s.area) for s in seg]) 
TypeError: 'Polygon' object is not iterable 

其中多邊形是shapelyPolygon class

我有自己的類精度: accuracy.ra_os

Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2721, in run_code 
    exec code_obj in self.user_global_ns, self.user_ns 
    File "<ipython-input-45-84ae6ec7b6f6>", line 1, in <module> 
    accuracy.ra_os 
    File "<ipython-input-7-1e04291926b0>", line 35, in ra_os 
    return np.average([(ref.intersection(s).area/s.area) for s in seg]) 
TypeError: 'Polygon' object is not iterable 
參考(一個)和分段(一個或多個)的多邊形

ref = <shapely.geometry.polygon.Polygon at 0x4997b38> 
seg = [<shapely.geometry.polygon.Polygon at 0x4b972e8>, <shapely.geometry.polygon.Polygon at 0x49c7390>] 



import math 
import numpy as np 
from shapely.geometry import Polygon 
nan = np.nan 



class Accuracy(object): 
    def __init__(self, ref, seg=None): 
     self.ref = ref 
     self.seg = seg 

    @property 
    def area(self): 
     return self.ref.area 

    @property 
    def perimeter(self): 
     return self.ref.length 

    @property 
    def centroidX(self): 
     return self.ref.centroid.x 

    @property 
    def centroidY(self): 
     return self.ref.centroid.y 

    @property 
    def segments(self): 
     if self.seg: 
      return len(self.seg) 
     else: 
      return 0 

    @property 
    def ra_or(self): 
     if self.seg: 
      return np.average([(ref.intersection(s).area/ref.area) for s in seg]) 
     else: 
      return nan 

    @property 
    def ra_os(self): 
     if self.seg: 
      return np.average([(ref.intersection(s).area/s.area) for s in seg]) 
     else: 
      return nan 

精度=精度(REF,seg_overlap)之間的統計值

如果我在班級以外運行功能我沒有這個錯誤

np.average([(ref.intersection(s).area/ref.area) for s in seg_overlap]) 
Out[47]: 0.48709794373000681 
+0

在某些時候,您將'seg'設置爲單個「Polygon」對象。 – 2013-03-15 15:27:22

回答

3

你的意思是說self.seg,而不是僅僅seg

return np.average([(ref.intersection(s).area/ref.area) for s in self.seg]) 
                   ^^^^^ 

(在這兩個函數)

我覺得你不小心指具有相同名稱的全局對象。

+0

感謝NPE,這是我錯過的 – 2013-03-15 15:33:43

+0

這是星期五晚上:P – 2013-03-15 15:34:19