前提
pythonで単位行列を表示させたいです。
n行n列の0行列を作ったあとで対角成分に1をセットするという順序で作りたいです。
実現したいこと
4*4の単位行列
[[1,0,0,0]
[0,1,0,0]
[0,0,1,0]
[0,0,0,1]]
を表示させたいです。
発生している問題・エラーメッセージ
4*4の零行列は作れたのですが、そこから対角成分に1をセットすることができません。
該当のソースコード
def identity_mat(n): z = [] for i in range(n): zrow = [] for j in range(n): zrow.append(0) z.append(zrow) return z # 4次の単位行列 mat_print(identity_mat(4))
として4*4の0行列を表示させました。return zの後に対角成分に1をセットしたいです。方法が思いつかないので教えていただきたいです。
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
2次元配列の、任意の場所に任意の値をセットする方法は知っていますか?
Numpy の eye メソッドを使うと簡便に単位行列を生成することができます。
numpy.eye — NumPy v1.24.dev0 Manual
https://numpy.org/devdocs/reference/generated/numpy.eye.html
「対角成分」とは何か?について質問に追記ください。
(というかそれが明確になれば答えは…)
その方法がわかっていません。申し訳ないです。
授業でNumpyをまだ習っていないためNumpyは使用することができません。申し訳ないです。リンクまでご丁寧に貼っていただきありがとうございます。
対角成分はi行とj列の時i=jのものだと思っています。if文でi==jとするのかなと思ったのですが、どうしたらリストの中に1をセットできるのかがわかりませんでした。
「zrow.append(0)」で何をしているかわかっていますか?
というか、この「identity_mat」関数がどのようにして、n×nの行列を作っているかわかっていますか?
「zrow.append(0)」でi行目が[0,0,0,0]となるようにしている理解していました。
m = [] # 空のリスト
for i in range(n): # 外側のリスト(行列全体)を作るループ
r = [] # i 番目の行を空のリストで初期化
for j in range(n): # 行を作るループ
r に要素を append で追加していく
m.append(r) # 外側のリストに i 行目を追加する
identity_mat関数については上のように解釈していました。きちんと理解しているかと言われるとわかっていないです。申し訳ないです。
いや、それで合っています。
その理解と、 単位行列は 、「i == j のとき1 、 そうでないときは 0」であるような行列であることも知っているわけですから、
zrow.append(0)
のように「いつでも0」 のところを、 if 分で書き換えればいいということはわかるのではないでしょうか。
ここで、「i == j のとき1 、 そうでないときは 0」 を zrowにappendすればいいのです。
分かりやすく説明していただきありがとうございます。
if とelseを使ったら正しく実行することができました。
知識不足でご迷惑をかけてしまいすみませんでした。最後までご丁寧にありがとうございます。
いえいえ。 迷惑なんてことはありませんよ。 せっかくの質問なのですから、ちゃんと理解してプログラミングしてほしいと思っているのです。
ベストアンサーになっている回答の処理も、どうしてそれで正しい値が設定されるのかをちゃんと理解して使えるといいですね。
回答3件
あなたの回答
tips
プレビュー