2
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 5 years have passed since last update.

初めてのQiita記事 (Pythonで正方行列を転置しよう)

Posted at

Quiitaに初投稿します。

はじめまして。こんにちは。
理系大学で数学を学んでいる 学部4年生の者です。
前からquiitaのアカウントは持っていたのですが投稿することも特になくROMアカとして使ってました。

しかし、最近 output の大事さと、Markdownの有用性に気づいたので、
練習がてら、お試し気分で正方行列を Pythonを用いて転置するプログラムを載せてみようかと思います。

TL;DR

Python を用いて 正方行列の転置を行うプログラムです。
このページは、私の練習用に作られたもので、専門性や、速さ、手軽さを求める方は別のページか既存のメソッドを使ってください。

当プログラムを書いた背景

私の研究室の K教授からこのようなお達しがありました。
「AI (Neural Network) でまるばつゲームのリーグ戦をやるから。ネットワークの設計と対戦をするプログラムはもう書いたからパラメータだけ設計して。」

そのような話を受け、僕は適当に手書きでパラメータを書いたテーブルを提出したのですが、研究仲間の J君は(めんどうだったらしく)ネットにあった誤差逆伝播法のプログラムをまんま引っ張ってきて、計算させたそうです。

そして実行して一言。
「あれ?」

コンソールを見せてもらうと次のような感じのエラーが.. \ デン /

TypeError: list indices must be integers or slices, not tuple

これは単に list を区切るための " ," が抜けているという凡ミスであることが判明。

そして " ," を追加して再度実行し.. \ デン /
(全く同じではありません。忘れましたごめんなさい。)

ValueError: shapes (10,8) and (10,) not aligned: 8 (dim 1) != 10 (dim 0)

む? 次元が違うというエラーか..
と思い、パラメータを計算したプログラムを確認すると、
重みが格納されている行列 W と 入力 x が np.dot(x, W)と書かれている。
ふむ。

一方、K教授が書かれたプログラムを見てみると、
y = np.dot(w,np.append(x,[1]))

あー。 行列とベクトルのドット積の順序が逆なのか..
と思い、転置すればいけるのではないかと J君が言い始めた。
NumPyにありそうだね。と言いながらもいまいち上手くいっていないご様子。

なので、簡単に2次元配列を転置するプログラムを書いて見た。
(提出期限が迫っていて、焦っていたし、暇だったので。)

CSVを読み込み、2次元配列に格納し、転置して上書きするプログラムを作成

transepose.py

# CSVの行と列を入れ替える Python  プログラム

import csv 

print('対象のfileをフルパスで指定 : ')
fpass = input()

# CSVファイルをlistで取得する。
with open(fpass, 'r') as f:
    # 一行ずつ表示
    reader = csv.reader(f)
    l = [row for row in reader]
    
print(l)

outer = []
for i in range(len(l)):
	out = []
	for j in range(len(l[i])):
		#print("l[i][j] = ", l[i][j])
		#print("l[j][i] = ", l[j][i])
		out.append(l[j][i])
	outer.append(out) 

	print(outer)

# 更新後のdata = out をCSV出力
with open(fpass, 'w') as f:  # 元のファイルに上書き
	writer = csv.writer(f)
	for i in range(len(outer)):
		writer.writerow(outer[i])

結果

これをドヤ顔で J君に渡したところ、以下のようなフィードバックをもらった。

  • ごめん、NumPyのメソッドでできたわ。
  • すげえ本当に 1 から書いたんだ。メソッドあるのに。
  • あと、CSVファイルじゃなくて .py なんだよね。

以上です。

そして後から気が付いたことに、
正方行列出ないと転置できないことに気が付いた。
(IndexError: list index out of range となる)

だめだめでした。

今後の予定

最近は ゼロ作を読んでいるので (払拭できない今更感)
今後は Python とそのライブラリ(TensorFlow とか, xgboost とか, sklearn とか..?)について書いていけたらいいなと思います。

正直いうと
文章書くのと、outputと、 Markdownの練習を兼ねた
ぼくのプログラム日記みたいなもんです。

ガチガチにすると、義務感と息苦しさで
こういうの続かないタイプなので、ゆるくいきます。ゆるく。

もし、続編あれば、今後ともお願いします。

2
0
2

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
2
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?