こんばんは(*´ω`)
昨日の延長です。
もう少し難易度を上げてみます。
取りあえず、ランダムで整数 0 ~ 4 を
無作為に選んで8行8列の行列を作ってみます。
import numpy as np
arr = np.random.randint(0,4,(8,8))
print(arr)
[[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。
取りあえず、正攻法で行きます。
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 となる座標を入れていきます。
[[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 に編集します。
取りあえず、さらっと載せますが、説明は後でします。
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)
#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 になっちゃいました(笑)
ちょっとバランスを調整しつつ、
全体像を再掲します。
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)
#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]]
個人的には、0 の座標を見つけてリストに取り込んだ後が悩みました。
例えば以下の実行結果から、例えば arr_pt[0] とすると。。
[[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