0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-21

こんばんは(*´ω`)

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

取りあえず、ランダムで整数 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

個人的には、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

0
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?