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

回答編集履歴

6

d

2020/05/18 06:01

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -42,8 +42,8 @@
42
42
  for で回すのでもいいと思いますが、一応、別解も書いておきます。
43
43
 
44
44
  1. [numpy.lexsort](https://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html) で点一覧を xyz 順にソートする。
45
- 1. `(x_pos,) = np.nonzero(np.diff(points[:, 0]))` で x 座標が変わるインデックスを調べる。
45
+ 1. `x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1` で x 座標が変わるインデックスを調べる。
46
- 1. `(y_pos,) = np.nonzero(np.diff(points[:, 1]))` で y 座標が変わるインデックスを調べる。
46
+ 1. `y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1` で y 座標が変わるインデックスを調べる。
47
47
  1. `np.unique(np.concatenate([x_pos, y_pos]))` で x または y 座標が変わるインデックスを取得する。
48
48
  1. x または y 座標が変わるインデックスの位置で点一覧を分割する。
49
49
 

5

d

2020/05/18 06:01

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -71,5 +71,5 @@
71
71
 
72
72
  for group in split_points:
73
73
  print(f"x={group[0, 0]}, y={group[0, 1]}")
74
- print(group)
74
+ print(group)
75
75
  ```

4

d

2020/05/18 06:00

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -62,9 +62,9 @@
62
62
  print(points)
63
63
 
64
64
  # xy の値が変わるインデックスを調べる。
65
- (x_pos,) = np.nonzero(np.diff(points[:, 0]))
65
+ x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1
66
- (y_pos,) = np.nonzero(np.diff(points[:, 1]))
66
+ y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1
67
- xy_pos = np.unique(np.concatenate([x_pos, y_pos])) + 1
67
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
68
68
 
69
69
  # xy の値が変わるインデックスで分割する。
70
70
  split_points = np.split(points, xy_pos)

3

d

2020/05/18 05:59

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -62,9 +62,9 @@
62
62
  print(points)
63
63
 
64
64
  # xy の値が変わるインデックスを調べる。
65
- (x_pos,) = np.nonzero(np.diff(points[:, 0])) + 1
65
+ (x_pos,) = np.nonzero(np.diff(points[:, 0]))
66
- (y_pos,) = np.nonzero(np.diff(points[:, 1])) + 1
66
+ (y_pos,) = np.nonzero(np.diff(points[:, 1]))
67
- xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
67
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos])) + 1
68
68
 
69
69
  # xy の値が変わるインデックスで分割する。
70
70
  split_points = np.split(points, xy_pos)

2

d

2020/05/18 05:58

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -35,4 +35,41 @@
35
35
  # [[1 2 2]
36
36
  # [1 2 0]
37
37
  # [1 2 0]]
38
+ ```
39
+
40
+ ## 追記
41
+
42
+ for で回すのでもいいと思いますが、一応、別解も書いておきます。
43
+
44
+ 1. [numpy.lexsort](https://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html) で点一覧を xyz 順にソートする。
45
+ 1. `(x_pos,) = np.nonzero(np.diff(points[:, 0]))` で x 座標が変わるインデックスを調べる。
46
+ 1. `(y_pos,) = np.nonzero(np.diff(points[:, 1]))` で y 座標が変わるインデックスを調べる。
47
+ 1. `np.unique(np.concatenate([x_pos, y_pos]))` で x または y 座標が変わるインデックスを取得する。
48
+ 1. x または y 座標が変わるインデックスの位置で点一覧を分割する。
49
+
50
+ ```python
51
+ import numpy as np
52
+
53
+ np.random.seed(0)
54
+
55
+ points = np.random.randint(0, 10, (20, 3))
56
+ print(points)
57
+ xy = (1, 2) # xy 座標
58
+
59
+ # xyz 順でソートする。
60
+ ind = np.lexsort((points[:, 2], points[:, 1], points[:, 0]))
61
+ points = points[ind]
62
+ print(points)
63
+
64
+ # xy の値が変わるインデックスを調べる。
65
+ (x_pos,) = np.nonzero(np.diff(points[:, 0])) + 1
66
+ (y_pos,) = np.nonzero(np.diff(points[:, 1])) + 1
67
+ xy_pos = np.unique(np.concatenate([x_pos, y_pos]))
68
+
69
+ # xy の値が変わるインデックスで分割する。
70
+ split_points = np.split(points, xy_pos)
71
+
72
+ for group in split_points:
73
+ print(f"x={group[0, 0]}, y={group[0, 1]}")
74
+ print(group)
38
75
  ```

1

d

2020/05/18 03:43

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -6,12 +6,33 @@
6
6
  np.random.seed(0)
7
7
 
8
8
  points = np.random.randint(0, 3, (20, 3))
9
+ print(points)
10
+ # [[0 1 0]
11
+ # [1 1 2]
12
+ # [0 2 0]
13
+ # [0 0 2]
14
+ # [1 2 2]
15
+ # [0 1 1]
16
+ # [1 1 0]
17
+ # [1 0 0]
18
+ # [1 2 0]
19
+ # [2 0 1]
20
+ # [1 2 0]
21
+ # [1 1 1]
22
+ # [0 2 0]
23
+ # [2 2 0]
24
+ # [2 0 0]
25
+ # [0 1 1]
26
+ # [2 0 0]
27
+ # [1 0 1]
28
+ # [2 2 0]
29
+ # [1 1 1]]
9
30
 
10
31
  xy = (1, 2) # xy 座標
11
32
 
12
- # points の1列目が xy[0] かつ points の2列目が xy[1] の行を抽出
33
+
13
34
  print(points[(points[:, 0] == xy[0]) & (points[:, 1] == xy[1])])
14
- [[1 2 2]
35
+ # [[1 2 2]
15
- [1 2 0]
36
+ # [1 2 0]
16
- [1 2 0]]
37
+ # [1 2 0]]
17
38
  ```