回答編集履歴
2
修正
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
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
|
+
```
|