【问题标题】:TypeError: len() of unsized object when comparing and I cannot make sense of itTypeError: len() of unsized object 比较时我无法理解
【发布时间】:2016-03-14 04:37:15
【问题描述】:

我正在尝试通过在其地理坐标周围放置一个框来选择传感器:

In [1]: lat_min, lat_max = lats(data)
        lon_min, lon_max = lons(data)

        print(np.around(np.array([lat_min, lat_max, lon_min, lon_max]), 5))
Out[1]: [ 32.87248  33.10181 -94.37297 -94.21224]

In [2]: select_sens = sens[(lat_min<=sens['LATITUDE']) & (sens['LATITUDE']<=lat_max) &
                           (lon_min<=sens['LONGITUDE']) & (sens['LONGITUDE']<=lon_max)].copy()
Out[2]: ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-7881f6717415> in <module>()
      4 lon_min, lon_max = lons(data)
      5 select_sens = sens[(lat_min<=sens['LATITUDE']) & (sens['LATITUDE']<=lat_max) &
----> 6                    (lon_min<=sens['LONGITUDE']) & (sens['LONGITUDE']<=lon_max)].copy()
      7 sens_data = data[data['ID'].isin(select_sens['ID'])].copy()
      8 sens_data.describe()

/home/kartik/miniconda3/lib/python3.5/site-packages/pandas/core/ops.py in wrapper(self, other, axis)
    703             return NotImplemented
    704         elif isinstance(other, (np.ndarray, pd.Index)):
--> 705             if len(self) != len(other):
    706                 raise ValueError('Lengths must match to compare')
    707             return self._constructor(na_op(self.values, np.asarray(other)),

TypeError: len() of unsized object

当然,sens 是一个 pandas DataFrame。即使我使用.where(),它也会引发同样的错误。我完全被难住了,因为这是一个简单的比较,不应该引发任何错误。甚至数据类型匹配:

In [3]: sens.dtypes
Out[3]: ID              object
        COUNTRY         object
        STATE           object
        COUNTY          object
        LENGTH         float64
        NUMBER          object
        NAME            object
        LATITUDE       float64
        LONGITUDE      float64
        dtype: object

那是怎么回事?!?

--编辑------ 根据 Ethan Furman 的回答,我做了以下更改:

In [2]: select_sens = sens[([lat_min]<=sens['LATITUDE']) & (sens['LATITUDE']<=[lat_max]) &
                           ([lon_min]<=sens['LONGITUDE']) & (sens['LONGITUDE']<=[lon_max])].copy()

而且(鼓声)它奏效了……但是为什么呢?

【问题讨论】:

    标签: python-3.x pandas python-3.5


    【解决方案1】:

    我不熟悉 NumPy 和 Pandas,但错误是说比较中的对象之一 if len(self) != len(other) 没有 __len__ 方法,因此没有长度。

    尝试使用print(sens_data) 看看是否出现类似错误。

    【讨论】:

    • 我已根据您的回答编辑了问题,并使其正常工作。但我仍然对__len__ 的比较要求感到困惑。也许我会等待熊猫经验丰富的人回答。非常感谢!
    • @Kartik:为什么要等?执行select_sens_bad = ...select_sens_good = ... 调查这两个对象。也许你能想出来! :)
    • sens 不会导致问题。 lat_maxlat_minlon_maxlon_min 是浮点数,没有长度。但我不知道为什么长度对于比较很重要。这就是我现在等待的答案。
    • @Kartik:sens['LATITUDE'] 返回什么?多元素数组?单元素数组?因为您的修复现在正在将单元素列表与该结果进行比较。
    • 一个多元素数组。 sens 是所有传感器元数据的表。确切地!我的解决方法是将单元素列表与数组进行比较。我有两个问题:首先,如果我有一个多元素列表来代替一个纬度或经度,那么比较将返回一个布尔向量,那么如何解决歧义?我的第一个问题是,我可以查看源代码来回答,但现在截止日期迫使我继续使用我的其余代码。也许等我有时间……
    【解决方案2】:

    我发现了一个类似的问题,认为问题可能与您使用的 Python 版本有关。

    我在 Spyder 中编写了我的代码 Python 3.6.1 |Anaconda 4.4.0(64 位)

    但随后将其传递给使用 Spyder 的人,但 Python 3.5.2 |Anaconda 4.2.0(64 位)

    我有一个 numpy.float64 对象(据我了解,类似于您的代码中的 lat_min、lat_max、lon_min 和 lon_max)MinWD.MinWD[i]

    In [92]: type(MinWD.MinWD[i])
    Out[92]: numpy.float64
    

    还有一个 Pandas 数据框 WatDemandCur,其中有一列名为 Percentages

    In [96]: type(WatDemandCur)
    Out[96]: pandas.core.frame.DataFrame
    
    In [98]: type(WatDemandCur['Percentages'])
    Out[98]: pandas.core.series.Series
    

    我想做下面的比较

    In [99]: MinWD.MinWD[i]==WatDemandCur.Percentages
    

    在我的机器上运行代码时这一行没有问题(Python 3.6.1

    但是我的朋友在 (Python 3.5.2) 中得到了和你类似的东西

    MinWD.MinWD[i]==WatDemandCur.Percentages
    Traceback (most recent call last):
    
      File "<ipython-input-99-3e762b849176>", line 1, in <module>
        MinWD.MinWD[i]==WatDemandCur.Percentages
    
      File "C:\Program Files\Anaconda3\lib\site-packages\pandas\core\ops.py", line 741, in wrapper
        if len(self) != len(other):
    
    TypeError: len() of unsized object
    

    我对他的问题的解决方案是将代码更改为

    [MinWD.MinWD[i]==x for x in WatDemandCur.Percentages] 
    

    它在两个版本中都有效!

    有了这个和你的证据,我认为不可能将 numpy.float64 和也许 numpy.integers 对象与 Pandas 系列进行比较,这可能部分与前者没有 len 的事实有关 功能。

    出于好奇,我对浮点数和整数对象做了一些测试(请说出与 numpy.float64 对象的区别)

    In [122]: Temp=1
    
    In [123]: Temp2=1.0
    
    In [124]: type(Temp)
    Out[124]: int
    
    In [125]: type(Temp2)
    Out[125]: float
    
    In [126]: len(Temp)
    Traceback (most recent call last):
    
      File "<ipython-input-126-dc80ab11ca9c>", line 1, in <module>
        len(Temp)
    
    TypeError: object of type 'int' has no len()
    
    
    In [127]: len(Temp2)
    Traceback (most recent call last):
    
      File "<ipython-input-127-a1b836f351d2>", line 1, in <module>
        len(Temp2)
    
    TypeError: object of type 'float' has no len()
    
    Temp==WatDemandCur.Percentages
    
    Temp2==WatDemandCur.Percentages
    

    两者都有效!

    结论

    1. 在另一个 python 版本中,您的代码应该可以工作!
    2. 比较的问题是特定于 numpy.floats 并且可能是 numpy.integers
    3. 当您包含 [] 或使用我的解决方案创建列表时,对象的类型会从 numpy.float 更改为列表,这样就可以正常工作。
    4. 虽然问题似乎与 numpy.float64 对象没有 len 函数这一事实有关,但浮点数和整数(它们也没有 len 函数)可以工作。

    希望其中一些对您或面临类似问题的其他人有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 2020-04-23
      • 1970-01-01
      • 2019-01-12
      • 2012-01-01
      • 2018-04-25
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多