行列から探して、編集してみよう

こんばんは(*´ω｀)

昨日の延長です。
もう少し難易度を上げてみます。

取りあえず、ランダムで整数 0 ~ 4 を
無作為に選んで8行8列の行列を作ってみます。

```test.py
import numpy as np
arr = np.random.randint(0,4,(8,8))
print(arr)
```

```実行結果.py
[[2 2 3 2 2 3 2 2]
 [3 1 0 2 1 2 3 1]
 [3 0 1 3 3 1 2 1]
 [1 2 1 1 1 2 2 2]
 [1 2 3 2 3 0 3 0]
 [0 2 0 0 0 1 0 3]
 [0 2 3 0 0 2 2 1]
 [3 3 2 3 3 2 2 0]]
```

取りあえず、ランダムに構成した行列から 0 を探します。
@LouiS0616さんに教わった記述は 1 つだけ見つけるやり方みたいで、
他にやり方があると思うのですが、すいません、上手くいきませんでした m(_ _)m。
取りあえず、正攻法で行きます。

```test.py
arr_pt=[]# カラのリストを作ります。

for i in range(8):
    for j in range(8):
        if arr[i,j] == 0:
            arr_pt.append([i,j])#カラのリストに、arr[i,j] == 0 となる座標を入れていきます。
```

```実行結果.py
[[2 0 2 1 1 0 3 3]
 [3 0 3 3 2 0 2 3]
 [2 2 0 3 0 2 0 2]
 [3 0 2 2 2 2 0 2]
 [3 0 3 0 1 0 1 0]
 [2 2 1 2 1 0 2 3]
 [1 3 2 1 2 0 0 1]
 [3 0 3 2 2 3 3 2]]
#以下のリストは見やすくするために、一旦、改行入れました m(_ _)m
#尚、座標は 0 行、0 列からのカウントになっています。
[[0, 1], [0, 5], [1, 1], [1, 5], [2, 2], [2, 4], [2, 6], [3, 1], 
[3, 6], [4, 1], [4, 3], [4, 5], [4, 7], [5, 5], [6, 5], [6, 6], [7, 1]]
```

python のリストは上限が無いので、
ランダムに生成した行列でも 0 の数が異なるのですが、
一通り、座標を格納してくれます、有難う( ｀ー´)ノ

後は、格納したリストから、座標情報を取り出してみます。
今回は0 が見つかった行と列、全てを 0 に編集します。
取りあえず、さらっと載せますが、説明は後でします。

```test.py
for k in range(len(arr_pt)):
    for l in range(8):
        arr[arr_pt[k][0],l] = 0
    for m in range(8):
        arr[m,arr_pt[k][1]] = 0

print(arr)
```

```実行結果.py
#before
[[3 2 3 2 2 1 2 2]
 [3 2 3 2 0 3 0 0]
 [3 3 3 0 2 2 0 1]
 [1 3 1 1 3 0 0 1]
 [2 0 1 3 2 0 3 3]
 [0 1 0 0 1 0 3 1]
 [2 0 3 0 1 3 2 2]
 [0 0 3 2 1 3 2 0]]
#after
[[0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]]
```

全部 0 になっちゃいました(笑)
ちょっとバランスを調整しつつ、
全体像を再掲します。

```test.py
import numpy as np

arr = np.random.randint(0,8,(8,8))# 8x8 の行列なので、0 - 8 をランダムに選ぶ事にしました。 
print(arr)

arr_pt=[]

for i in range(8):
    for j in range(8):
        if arr[i,j] == 0:
            arr_pt.append([i,j])
            
print(arr_pt)

#arr_pt[0][0] は arr_pt[0] = X としてしまえば、X[0] って事です
#これをヒントにしたの記述を読んでみてください
for k in range(len(arr_pt)):
    for l in range(8):
        arr[arr_pt[k][0],l] = 0 # arr_pt[k] を X とすると arr[X[0],l] になります/特定の行の値を all 0
    for m in range(8):
        arr[m,arr_pt[k][1]] = 0 # arr_pt[k] を X とすると arr[m,X[1]] になります/特定の列の値を all 0

print(arr)
```

``` 実行結果.py
#before
[[3 0 6 5 7 7 5 0]
 [5 5 1 7 5 0 7 7]
 [4 5 2 2 2 7 1 3]
 [5 5 7 0 3 3 0 7]
 [0 3 0 4 7 1 1 0]
 [3 3 3 7 6 7 1 7]
 [3 1 4 4 5 5 7 7]
 [5 2 6 0 2 4 3 3]]

# 0 address (= arry_pt)
[[0, 1], [0, 7], [1, 5], [3, 3], [3, 6], [4, 0], [4, 2], [4, 7], [7, 3]]

#after
[[0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 2 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 6 0 0 0]
 [0 0 0 0 5 0 0 0]
 [0 0 0 0 0 0 0 0]]
```

実行結果のイメージはこんな感じです。
![図1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/8f1132b6-1eca-c956-716c-8781d03d30d8.png)

個人的には、0 の座標を見つけてリストに取り込んだ後が悩みました。
例えば以下の実行結果から、例えば arr_pt[0] とすると。。

``` 実行結果.py
[[0, 1], [0, 7], [1, 5], [3, 3], [3, 6], [4, 0], [4, 2], [4, 7], [7, 3]] # arr_pt
[0, 1]# arr_pt[0]
```

っとなります。座標を取り出すのは良いけど、
どうやって、8 x 8 の行列の要素に反映すればいいのか分かりませんでした。
さらっと書いていますが、arr_pt[0][0] とすれば [0,1] から 0 を取り出してくれます。
逆に arr_pt[0][1] とすれば [0,1] から 1 を取り出してくれます。

面白いですね。

あとは、ここまで for を使い込まなくても良い気がしますが
すいません、good idea が思い浮かばず。。

有識者の方、アドバイスがあれば宜しくお願い致します。m(_ _)m