Pythonクックブック(4章)
リストで行列を表現
リストの要素を行列の列に見立てると以下のように足す、引く、掛けるの演算が出来る。
割るは、逆行列のかけ算と定義すれば良いが、逆行列の算出方法自体を忘れてしまったので今回はパス。
[kobakoba0723@fedora13-intel64 ~]$ cat calc_matrix.py def add(matrix1, matrix2): added = [] for (row1, row2) in zip(matrix1, matrix2): add_row = [] for (element1, element2) in zip(row1, row2): add_row.append(element1 + element2) added.append(add_row) return added def subtract(matrix1, matrix2): subtracted = [] for (row1, row2) in zip(matrix1, matrix2): subtracted_row = [] for (element1, element2) in zip(row1, row2): subtracted_row.append(element1 - element2) subtracted.append(subtracted_row) return subtracted def multiply(matrix1, matrix2): transposition_multiplied = [] for i in range(len(matrix1[0])): matrix1_column = [row[i] for row in matrix1] multiplied_row = [] for j in range(len(matrix2)): multiplied_row_element = 0 for (element1, element2) in zip(matrix1_column, matrix2[j]): multiplied_row_element += element1 * element2 multiplied_row.append(multiplied_row_element) transposition_multiplied.append(multiplied_row) # リストの各要素は、行列の"列"を表すので転置が必要 return [[row[i] for row in transposition_multiplied] for i in range(len(transposition_multiplied[0]))] if __name__ == '__main__': matrix1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] matrix2 = [[2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]] print 'matrix1:', matrix1 print 'matrix2:', matrix2 print 'matrix1 + matrix2 =', add(matrix1, matrix2) print 'matrix1 - matrix2 =', subtract(matrix1, matrix2) # 4*3行列とのかけ算なので、3*4行列が必要 transposition_matrix2 = [[row[i] for row in matrix2] for i in range(len(matrix2[0]))] print 'matrix1 * trans_matrix2 =', multiply(matrix1, transposition_matrix2) print matrix1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] matrix2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print 'matrix1:', matrix1 print 'matrix2:', matrix2 print 'matrix1 + matrxi2 =', add(matrix1, matrix2) print 'matrix1 - matrxi2 =', subtract(matrix1, matrix2) print 'matrix1 * matrxi2 = ', multiply(matrix1, matrix2) [kobakoba0723@fedora13-intel64 ~]$ python calc_matrix.py matrix1: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] matrix2: [[2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]] matrix1 + matrix2 = [[3, 5, 7, 9], [11, 13, 15, 17], [19, 21, 23, 25]] matrix1 - matrix2 = [[-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1]] matrix1 * trans_matrix2 = [[122, 140, 158, 176], [137, 158, 179, 200], [152, 176, 200, 224], [167, 194, 221, 248]] matrix1: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] matrix2: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] matrix1 + matrxi2 = [[2, 4, 6], [8, 10, 12], [14, 16, 18]] matrix1 - matrxi2 = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] matrix1 * matrxi2 = [[30, 36, 42], [66, 81, 96], [102, 126, 150]] [kobakoba0723@fedora13-intel64 ~]$
行列演算などの数値演算用に、サードパーティーのNumpyモジュールがあるが、
今まで行列演算を実装したことがなかったので、折角の機会ということで実装。
参考サイト
- 作者: Alex Martelli,Anna Martelli Ravenscroft,David Ascher,鴨澤眞夫,當山仁健,吉田聡,吉宗貞紀
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/06/26
- メディア: 大型本
- 購入: 11人 クリック: 423回
- この商品を含むブログ (85件) を見る