【问题标题】:KD Tree construction PyhtonKD树构建Python
【发布时间】:2022-10-15 10:34:28
【问题描述】:

我正在尝试用 Python 构建一个 KD 树,我已经创建了这个类

class KD_Tree:

def __init__(self,data):
    self.data = data
    self.tree = None
    
def _build(self,points,depth):
    k = len(points.columns)
    _axis = depth % k
    _column = points.columns[_axis]

    if len(points) == 0:
        return None

    objects_list = points.sort_values(by = [_column], ascending = True)

    if len(objects_list) % 2 == 0:

        median_idx = int ( ( len(objects_list)/2) )
    else:
        median_idx = floor ( ( len(objects_list)/2) )

    node = Node( round(objects_list.iloc[median_idx][_column],3))
    node.left = self._build(objects_list.iloc[0:median_idx],depth+1)
    node.right = self._build(objects_list.iloc[median_idx+1:],depth+1)
    
    return node

def build(self):
    self.tree = self._build(self.data,depth=0)

    

这是我测试它的方式,但我不断收到同样的错误

test_df =  pd.DataFrame( data = [ (2,3),(5,4),(9,6),(4,7),(8,1),(7,2)],columns = ["X", "Y"])
KD = KD_Tree(test_df)
KD.build()

我收到这个错误

 NodeValueError                            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_3900/1487032925.py in <module>
      1 KD = KD_Tree(test_df)
----> 2 KD.build()

~\AppData\Local\Temp/ipykernel_3900/1303367285.py in build(self)
     28 
     29     def build(self):
---> 30         self.tree = self._build(self.data,depth=0)
     31 
     32 

~\AppData\Local\Temp/ipykernel_3900/1303367285.py in _build(self, points, depth)
     21             median_idx = floor ( ( len(objects_list)/2) )
     22 
---> 23         node = Node( round(objects_list.iloc[median_idx][_column],3))
     24         node.left = self._build(objects_list.iloc[0:median_idx],depth+1)
     25         node.right = self._build(objects_list.iloc[median_idx+1:],depth+1)

c:\users\gabri\appdata\local\programs\python\python39\lib\site-packages\binarytree\__init__.py in __init__(self, value, left, right)
    101         right: Optional["Node"] = None,
    102     ) -> None:
--> 103         self.value = self.val = value
    104         self.left = left
    105         self.right = right

c:\users\gabri\appdata\local\programs\python\python39\lib\site-packages\binarytree\__init__.py in __setattr__(self, attr, obj)
    204         elif attr == _ATTR_VALUE:
    205             if not isinstance(obj, (float, int)):
--> 206                 raise NodeValueError("node value must be a float or int")
    207             object.__setattr__(self, _ATTR_VAL, obj)
    208 

NodeValueError: node value must be a float or int

知道为什么吗?

【问题讨论】:

    标签: python build kdtree


    【解决方案1】:

    轮换后键入节点中的值

    用这个:

    节点 = 节点(int(圆形(objects_list.iloc[median_idx][_column],3)))

    【讨论】:

      猜你喜欢
      • 2016-09-22
      • 2011-05-11
      • 2012-10-16
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多