回答編集履歴

2

追記

2021/10/04 09:05

投稿

8524ba23
8524ba23

スコア38341

test CHANGED
@@ -36,6 +36,46 @@
36
36
 
37
37
  ```
38
38
 
39
- なお、の方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
39
+ なお、上記の方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
40
40
 
41
+
42
+
41
- 複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。
43
+ 以下のように、複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。
44
+
45
+ ```Python
46
+
47
+ import numpy as np
48
+
49
+ from scipy.spatial import KDTree
50
+
51
+
52
+
53
+ target = np.array([[1,1],[2,2],[3,3]])
54
+
55
+ data = np.array([[1.1,1.1],[1.4,1.4],[2.9,2.9]])
56
+
57
+
58
+
59
+ ret = []
60
+
61
+ while target.shape[0] > 0 and data.shape[0] > 0:
62
+
63
+ kdtree = KDTree(target)
64
+
65
+ dis, ids = kdtree.query(data)
66
+
67
+ dat_i = dis.argmin() # 最も距離の近いペアの位置
68
+
69
+ tar_i = ids[dat_i]
70
+
71
+ ret.append((data[dat_i], target[tar_i]))
72
+
73
+ data = np.delete(data, dat_i, 0)
74
+
75
+ target = np.delete(target, tar_i, 0)
76
+
77
+
78
+
79
+ 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]))]
80
+
81
+ ```

1

追記

2021/10/04 09:05

投稿

8524ba23
8524ba23

スコア38341

test CHANGED
@@ -35,3 +35,7 @@
35
35
  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]))]
36
36
 
37
37
  ```
38
+
39
+ なお、この方法だと、データによっては直観に反した(不自然な)採り方をすることがありえます。
40
+
41
+ 複数の`data`と`target`の中から**最も距離の小さい**最近傍点のペアを取り除きつつループしたほうがより自然になるかと思います。