LoginSignup
0
0

More than 1 year has passed since last update.

CSV形式の行列を読み込むプログラム(Python)

Posted at

プログラムについて

https://qiita.com/persim/items/87f4812fe8bf0ab90d00
上の記事で作成したCSV形式の行列をPythonで読み込むプログラムを作成しました.

環境

  • MacBook Air(M1, 2020)
  • Docker(Ubuntu 20.04.5 LTS)
  • g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

プログラム

readMatrix.py
import numpy as np
import csv
import sys

File_name = sys.argv[1]

# CSV形式のファイルから行列データを取得する
with open(File_name, 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    matrix_info = next(csv_reader)
    matrix_list = list(csv_reader)

N = matrix_info[0].split()[1]
size = int(N)
ratio = 100 * int(matrix_info[2]) / (size * size)
print("行列の大きさ:" + N)
print("行における非零要素数の最大値:" + matrix_info[1])
print("0要素の数:" + matrix_info[2])
print("行列における0要素の割合:" + str(round(ratio, 1)) + "%")

# 型をstrからfloatへ変換する
A = np.vectorize(float)(matrix_list)
print(A)

# 連立一次方程式を解く例(x=1)
x = np.ones(size)

b = A@x

x = np.zeros(size)

x = np.linalg.solve(A, b)
print(x)

 
# 行列の内, 0要素の位置を取得する
tuple_len = len(np.where(A == 0)[0])

for i in range(tuple_len):
    print("(" + str(np.where(A == 0)[0][i]) + "," + str(np.where(A == 0)[1][i]) + ")", end=',')
print()

実行結果

今回作成したプログラムでは,行列ファイルの最初の行にある以下の情報を読み取り表示しています.

  • 行列の大きさ
  • 行における非零要素数の最大値
  • 0要素の数

また,行列における0要素の割合と今回読み取った行列も表示するようにしています.

今回は読み取った行列が扱えるかどうかを確かめるために,解が1となる連立一次方程式を構築して解いています.

この結果が実行例の下から2行目の部分に示されており,実際に解が1となっているため問題なく動いていることが確認できます.

最後に行列の0要素の位置について表示するようにしていますが,使うかどうかは不明です.

実行例
$python3 readMatrix.py 4_4matrix20230111020709.csv 
行列の大きさ:4
行における非零要素数の最大値:3
0要素の数:10
行列における0要素の割合:62.5%
[[0.07166036 0.         0.         0.        ]
 [0.         0.87274294 0.         0.        ]
 [0.         0.43164124 0.55939415 0.25492239]
 [0.         0.         0.         0.96646873]]
[1. 1. 1. 1.]
(0,1),(0,2),(0,3),(1,0),(1,2),(1,3),(2,0),(3,0),(3,1),(3,2),
0
0
0

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