teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2021/10/04 09:05

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -17,5 +17,25 @@
17
17
 
18
18
  print(ret) # [(array([1.1, 1.1]), array([1, 1])), (array([1.4, 1.4]), array([2, 2])), (array([2.9, 2.9]), array([3, 3]))]
19
19
  ```
20
- なお、の方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
20
+ なお、上記の方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
21
+
21
- 複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。
22
+ 以下のように、複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。
23
+ ```Python
24
+ import numpy as np
25
+ from scipy.spatial import KDTree
26
+
27
+ target = np.array([[1,1],[2,2],[3,3]])
28
+ data = np.array([[1.1,1.1],[1.4,1.4],[2.9,2.9]])
29
+
30
+ ret = []
31
+ while target.shape[0] > 0 and data.shape[0] > 0:
32
+ kdtree = KDTree(target)
33
+ dis, ids = kdtree.query(data)
34
+ dat_i = dis.argmin() # 最も距離の近いペアの位置
35
+ tar_i = ids[dat_i]
36
+ ret.append((data[dat_i], target[tar_i]))
37
+ data = np.delete(data, dat_i, 0)
38
+ target = np.delete(target, tar_i, 0)
39
+
40
+ print(ret) # [(array([1.1, 1.1]), array([1, 1])), (array([2.9, 2.9]), array([3, 3])), (array([1.4, 1.4]), array([2, 2]))]
41
+ ```

1

追記

2021/10/04 09:05

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -16,4 +16,6 @@
16
16
  target = np.delete(target, idx, 0)
17
17
 
18
18
  print(ret) # [(array([1.1, 1.1]), array([1, 1])), (array([1.4, 1.4]), array([2, 2])), (array([2.9, 2.9]), array([3, 3]))]
19
- ```
19
+ ```
20
+ なお、この方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
21
+ 複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。