回答編集履歴

6

d

2020/05/18 06:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -86,9 +86,9 @@
86
86
 
87
87
  1. [numpy.lexsort](https://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html) で点一覧を xyz 順にソートする。
88
88
 
89
- 1. `(x_pos,) = np.nonzero(np.diff(points[:, 0]))` で x 座標が変わるインデックスを調べる。
89
+ 1. `x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1` で x 座標が変わるインデックスを調べる。
90
90
 
91
- 1. `(y_pos,) = np.nonzero(np.diff(points[:, 1]))` で y 座標が変わるインデックスを調べる。
91
+ 1. `y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1` で y 座標が変わるインデックスを調べる。
92
92
 
93
93
  1. `np.unique(np.concatenate([x_pos, y_pos]))` で x または y 座標が変わるインデックスを取得する。
94
94
 

5

d

2020/05/18 06:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -144,6 +144,6 @@
144
144
 
145
145
  print(f"x={group[0, 0]}, y={group[0, 1]}")
146
146
 
147
- print(group)
147
+ print(group)
148
148
 
149
149
  ```

4

d

2020/05/18 06:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -126,11 +126,11 @@
126
126
 
127
127
  # xy の値が変わるインデックスを調べる。
128
128
 
129
- (x_pos,) = np.nonzero(np.diff(points[:, 0]))
129
+ x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1
130
130
 
131
- (y_pos,) = np.nonzero(np.diff(points[:, 1]))
131
+ y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1
132
132
 
133
- xy_pos = np.unique(np.concatenate([x_pos, y_pos])) + 1
133
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
134
134
 
135
135
 
136
136
 

3

d

2020/05/18 05:59

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -126,11 +126,11 @@
126
126
 
127
127
  # xy の値が変わるインデックスを調べる。
128
128
 
129
- (x_pos,) = np.nonzero(np.diff(points[:, 0])) + 1
129
+ (x_pos,) = np.nonzero(np.diff(points[:, 0]))
130
130
 
131
- (y_pos,) = np.nonzero(np.diff(points[:, 1])) + 1
131
+ (y_pos,) = np.nonzero(np.diff(points[:, 1]))
132
132
 
133
- xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
133
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos])) + 1
134
134
 
135
135
 
136
136
 

2

d

2020/05/18 05:58

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -73,3 +73,77 @@
73
73
  # [1 2 0]]
74
74
 
75
75
  ```
76
+
77
+
78
+
79
+ ## 追記
80
+
81
+
82
+
83
+ for で回すのでもいいと思いますが、一応、別解も書いておきます。
84
+
85
+
86
+
87
+ 1. [numpy.lexsort](https://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html) で点一覧を xyz 順にソートする。
88
+
89
+ 1. `(x_pos,) = np.nonzero(np.diff(points[:, 0]))` で x 座標が変わるインデックスを調べる。
90
+
91
+ 1. `(y_pos,) = np.nonzero(np.diff(points[:, 1]))` で y 座標が変わるインデックスを調べる。
92
+
93
+ 1. `np.unique(np.concatenate([x_pos, y_pos]))` で x または y 座標が変わるインデックスを取得する。
94
+
95
+ 1. x または y 座標が変わるインデックスの位置で点一覧を分割する。
96
+
97
+
98
+
99
+ ```python
100
+
101
+ import numpy as np
102
+
103
+
104
+
105
+ np.random.seed(0)
106
+
107
+
108
+
109
+ points = np.random.randint(0, 10, (20, 3))
110
+
111
+ print(points)
112
+
113
+ xy = (1, 2) # xy 座標
114
+
115
+
116
+
117
+ # xyz 順でソートする。
118
+
119
+ ind = np.lexsort((points[:, 2], points[:, 1], points[:, 0]))
120
+
121
+ points = points[ind]
122
+
123
+ print(points)
124
+
125
+
126
+
127
+ # xy の値が変わるインデックスを調べる。
128
+
129
+ (x_pos,) = np.nonzero(np.diff(points[:, 0])) + 1
130
+
131
+ (y_pos,) = np.nonzero(np.diff(points[:, 1])) + 1
132
+
133
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
134
+
135
+
136
+
137
+ # xy の値が変わるインデックスで分割する。
138
+
139
+ split_points = np.split(points, xy_pos)
140
+
141
+
142
+
143
+ for group in split_points:
144
+
145
+ print(f"x={group[0, 0]}, y={group[0, 1]}")
146
+
147
+ print(group)
148
+
149
+ ```

1

d

2020/05/18 03:43

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -14,20 +14,62 @@
14
14
 
15
15
  points = np.random.randint(0, 3, (20, 3))
16
16
 
17
+ print(points)
18
+
19
+ # [[0 1 0]
20
+
21
+ # [1 1 2]
22
+
23
+ # [0 2 0]
24
+
25
+ # [0 0 2]
26
+
27
+ # [1 2 2]
28
+
29
+ # [0 1 1]
30
+
31
+ # [1 1 0]
32
+
33
+ # [1 0 0]
34
+
35
+ # [1 2 0]
36
+
37
+ # [2 0 1]
38
+
39
+ # [1 2 0]
40
+
41
+ # [1 1 1]
42
+
43
+ # [0 2 0]
44
+
45
+ # [2 2 0]
46
+
47
+ # [2 0 0]
48
+
49
+ # [0 1 1]
50
+
51
+ # [2 0 0]
52
+
53
+ # [1 0 1]
54
+
55
+ # [2 2 0]
56
+
57
+ # [1 1 1]]
58
+
17
59
 
18
60
 
19
61
  xy = (1, 2) # xy 座標
20
62
 
21
63
 
22
64
 
23
- # points の1列目が xy[0] かつ points の2列目が xy[1] の行を抽出
65
+
24
66
 
25
67
  print(points[(points[:, 0] == xy[0]) & (points[:, 1] == xy[1])])
26
68
 
27
- [[1 2 2]
69
+ # [[1 2 2]
28
70
 
29
- [1 2 0]
71
+ # [1 2 0]
30
72
 
31
- [1 2 0]]
73
+ # [1 2 0]]
32
74
 
33
75
  ```