ソースコードのコメントを見ると、木構造は KDTree
オブジェクトの node_data
属性に格納されている1次元配列で管理されているようです。
コメントによると、KDTree.node_data[0] がルートノードで、ノード KDTree.node_data[i] の2つの子ノードは KDTree.node_data[2 * i + 1] 及び KDTree.node_data[2 * i + 2] を参照すればよいようです。
KDTree.node_data の各要素の意味等はソースコードのコメント等を見てください。(3000行ぐらいあり、全部は読んでないので実装の細部まではわかりません。)
KDTree クラスは BinaryTree クラスを継承しているので、以下の2つが該当のコードです。
# In a typical KD Tree or Ball Tree implementation, the nodes are implemented
# as dynamically allocated structures with pointers linking them. Here we
# take a different approach, storing all relevant data in a set of arrays
# so that the entire tree object can be saved in a pickle file. For efficiency,
# the data can be stored in such a way that explicit pointers are not
# necessary: for node data stored at index i, the two child nodes are at
# index (2 * i + 1) and (2 * i + 2); the parent node is (i - 1) // 2
# (where // indicates integer division).
1次元配列を木構造にして確認する格納するコード
python
1# 木構造の可視化に anytree という外部ライブラリを使っています。
2# pip install anytree でインストールできます。
3import numpy as np
4from anytree import Node, RenderTree
5from sklearn.neighbors import KDTree
6
7np.random.seed(0)
8X = np.random.randint(0, 101, (20, 2))
9
10tree = KDTree(X, leaf_size=2)
11
12
13def tarverse(i=0, parent=None):
14 node = Node(i, parent)
15
16 if i * 2 + 1 < len(tree.node_data):
17 tarverse(i * 2 + 1, node)
18 tarverse(i * 2 + 2, node)
19
20 return node
21
22
23tree = tarverse()
24print(RenderTree(tree))
Node('/0')
├── Node('/0/1')
│ ├── Node('/0/1/3')
│ │ ├── Node('/0/1/3/7')
│ │ └── Node('/0/1/3/8')
│ └── Node('/0/1/4')
│ ├── Node('/0/1/4/9')
│ └── Node('/0/1/4/10')
└── Node('/0/2')
├── Node('/0/2/5')
│ ├── Node('/0/2/5/11')
│ └── Node('/0/2/5/12')
└── Node('/0/2/6')
├── Node('/0/2/6/13')
└── Node('/0/2/6/14')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 06:39