回答編集履歴

2

修正

2020/09/18 03:57

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,3 +1,123 @@
1
+ 流下先配列の特定の座標に着目したとき、その座標の値が「4」ならば、一つ下の座標に侵食量の値がプラスされると、いうことかと思います。
2
+
3
+ 逆に言えば、ある特定座標の上の座標の値が「4」ならば、その座標に上の座標の侵食量の値がプラスされるということになります。
4
+
5
+
6
+
7
+ したがって配列を畳み込み演算のように3*3のブロックごとに処理していけば良いです。
8
+
9
+
10
+
11
+ ```python
12
+
13
+ from skimage.util import view_as_windows
14
+
15
+
16
+
17
+ # 移動マップ
18
+
19
+ d = np.array([[7, 0, 1],
20
+
21
+ [6, 9, 2],
22
+
23
+ [5, 4, 3]])[::-1, ::-1]
24
+
25
+
26
+
27
+ m = np.array([[4, 4], [2, 8]]) # 流下先配列
28
+
29
+ s = np.array([[1, 1], [1, 1]]) # 侵食量配列
30
+
31
+
32
+
33
+ # 移動後の土砂配列の計算
34
+
35
+ m_block = view_as_windows(np.pad(m, 1, constant_values=8), (3, 3))
36
+
37
+ # [[8 8 8 8]
38
+
39
+ # [8 4 4 8] [[888] [[888] [[844] [[448]
40
+
41
+ # [8 2 8 8] [ [844] [448] [828] [288] ]
42
+
43
+ # [8 8 8 8]] -> [828]], [288]], [888]], [888]]
44
+
45
+ s_block = view_as_windows(np.pad(s, 1, constant_values=0), (3, 3))
46
+
47
+ c = np.sum(((m_block == d) * s_block), (2, 3))
48
+
49
+
50
+
51
+ c
52
+
53
+ # array([[0, 0],
54
+
55
+ # [1, 2]])
56
+
57
+ ```
58
+
59
+
60
+
61
+ ```python
62
+
63
+ np.random.seed(0)
64
+
65
+ m = np.random.randint(0, 9, (5, 5)) # 流下先配列
66
+
67
+ # [[5 0 3 3 7]
68
+
69
+ # [3 5 2 4 7]
70
+
71
+ # [6 8 8 1 6]
72
+
73
+ # [7 7 8 1 5]
74
+
75
+ # [8 4 3 0 3]]
76
+
77
+ s = np.random.randint(1, 3, (5, 5)) # 侵食量配列
78
+
79
+ # [[2 1 2 2 1]
80
+
81
+ # [1 2 1 2 2]
82
+
83
+ # [2 2 2 1 2]
84
+
85
+ # [1 2 2 2 2]
86
+
87
+ # [1 2 1 1 2]]
88
+
89
+
90
+
91
+ # 移動後の土砂配列の計算
92
+
93
+ m_block = view_as_windows(np.pad(m, 1, constant_values=8), (3, 3))
94
+
95
+ s_block = view_as_windows(np.pad(s, 1, constant_values=0), (3, 3))
96
+
97
+ c = np.sum(((m_block == d) * s_block), (2, 3))
98
+
99
+ # [[0 0 0 2 0]
100
+
101
+ # [0 0 0 3 3]
102
+
103
+ # [4 1 0 4 2]
104
+
105
+ # [0 0 0 1 0]
106
+
107
+ # [0 0 0 2 0]]
108
+
109
+ ```
110
+
111
+
112
+
113
+ ----
114
+
115
+
116
+
117
+ (以下は以前の解答)
118
+
119
+
120
+
1
121
  全体的な処理フローは専門外のためよくわかってないですが(すみません)、
2
122
 
3
123
  とりあえず「赤枠内でやりたいこと」というのはこういうことでしょうか……?
@@ -33,69 +153,3 @@
33
153
  # [1, 2]])
34
154
 
35
155
  ```
36
-
37
-
38
-
39
- ```python
40
-
41
- d
42
-
43
- # 701
44
-
45
- # 692
46
-
47
- # 543
48
-
49
-
50
-
51
- m = view_as_windows(d, (2, 2))
52
-
53
- # 70 | 01
54
-
55
- # 69 | 92
56
-
57
- # ---+---
58
-
59
- # 69 | 92
60
-
61
- # 54 | 43
62
-
63
-
64
-
65
- v[::-1, ::-1]
66
-
67
- # 82 |
68
-
69
- # 44 |
70
-
71
- # ---+---
72
-
73
- # |
74
-
75
- # |
76
-
77
-
78
-
79
- m == v[::-1, ::-1]
80
-
81
- # 00 | 00
82
-
83
- # 00 | 00
84
-
85
- # ---+---
86
-
87
- # 00 | 01
88
-
89
- # 01 | 10
90
-
91
-
92
-
93
- np.sum(m == v[::-1, ::-1], (2, 3))
94
-
95
- # 0 | 0
96
-
97
- # --+--
98
-
99
- # 1 | 2
100
-
101
- ```

1

2020/09/18 03:57

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,6 +1,6 @@
1
1
  全体的な処理フローは専門外のためよくわかってないですが(すみません)、
2
2
 
3
- とりあえず「赤枠内でやりたいこと」はこういうことでしょうか……?
3
+ とりあえず「赤枠内でやりたいこと」というのはこういうことでしょうか……?
4
4
 
5
5
 
6
6
 
@@ -33,3 +33,69 @@
33
33
  # [1, 2]])
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ ```python
40
+
41
+ d
42
+
43
+ # 701
44
+
45
+ # 692
46
+
47
+ # 543
48
+
49
+
50
+
51
+ m = view_as_windows(d, (2, 2))
52
+
53
+ # 70 | 01
54
+
55
+ # 69 | 92
56
+
57
+ # ---+---
58
+
59
+ # 69 | 92
60
+
61
+ # 54 | 43
62
+
63
+
64
+
65
+ v[::-1, ::-1]
66
+
67
+ # 82 |
68
+
69
+ # 44 |
70
+
71
+ # ---+---
72
+
73
+ # |
74
+
75
+ # |
76
+
77
+
78
+
79
+ m == v[::-1, ::-1]
80
+
81
+ # 00 | 00
82
+
83
+ # 00 | 00
84
+
85
+ # ---+---
86
+
87
+ # 00 | 01
88
+
89
+ # 01 | 10
90
+
91
+
92
+
93
+ np.sum(m == v[::-1, ::-1], (2, 3))
94
+
95
+ # 0 | 0
96
+
97
+ # --+--
98
+
99
+ # 1 | 2
100
+
101
+ ```