記事

Numpy & Scipy - 1.1 行列とベクトルの表記法、行列の入出力

Numpy & Scipy - 1.1 行列とベクトルの表記法、行列の入出力
Visitors


Numpy の特徴

  • 数学、科学計算のためのライブラリです。行列および配列を処理したり演算します。 random.rand で乱数を生成できます。



行列生成

1
2
3
4
5
6
import numpy as np # numpyパッケージをロードしてnpという名前で使用      
a = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.float64) # 2次元行列生成     
b = np.array([1,2,3]) # 1次元行列生成     
    
print(a)
print(b)
1
2
3
4
5
[[ 1.   2.5  3. ]
 [-1.  -2.  -1.5]
[ 4.   5.5  6. ]]

[7 5 3]



shape method

  • $n imes n$ 行列を (rows, columns) 形式のタプルデータ型で返します。
1
2
print(a.shape) # タプルデータ型で返却
print(b.shape) # (3,) と出る。1次元ベクトルと考えれば良い。
1
2
(3, 3)
(3,)



complex matrix

1
2
3
4
5
c = np.array([[1 - 2j , 3 + 1j, 1], [1+2j, 2-1j, 7]]) ## jの前には必ず数字が来なければならない。
d = np.array([1+8j, -2j])

print(c)
print(d)
1
2
3
4
[[1.-2.j 3.+1.j 1.+0.j]
[1.+2.j 2.-1.j 7.+0.j]]

[ 1.+8.j -0.-2.j]



Data Type : dtype

  • 通常numpyでは実数部分は np.float64、虚数部分は np.complex128 のデータタイプを使用します。

  • 実数行列 a に虚数を代入するとエラー発生

1
a[1,1] = 0 + 2j
1
TypeError: can't convert complex to float


  • したがって明示的に array を作る時に dtype を決めましょう。
  • そして complex type で生成すれば実数、虚数両方使用可能です。
1
2
a = np.array([[1, 2.5, 3], [-1, -2, -1.5], [4, 5.5, 6]], dtype=np.float64) ## dtypeがdefault引数で省略されていたため
a = np.array([[1, 2.5, 3], [-1, -2, -1.5], [4, 5.5, 6]], dtype=np.complex128) ## 最初からcomplexタイプにすれば実数、虚数両方使用可能


1
2
3
4
5
# 明示的タイプキャスト
a.astype(dtype=np.complex128)

# 暗黙的タイプキャスト
a = a + b # a:complex, b:float -> a:complex



ファイル(.txt) 読み込み

# "Save/input1.txt" 内容
1.0 2.5 3.0
-1.0 -2.0 -1.5
4.0 5.0 6.0

# "Save/input2.txt"
# complex 数式は括弧の中に入れて処理する。
(1-2j) (3+j) (1) 
(1+2j) (2-j) 7


1
2
3
4
5
6
7
8
9
a = np.genfromtxt("Save/input1.txt", delimiter=" ", dtype=np.float64) # path, 区切り文字(空白, "," ...) , データタイプ

print(a)
print(a.shape)

b = np.genfromtxt("Save/input2.txt", delimeter=" ", dtype=np.complex128)

print(b)
print(b.shape)
1
2
3
4
5
6
7
8
9
10
11
[[ 1.   2.5  3. ]
[-1.  -2.  -1.5]
[ 4.   5.   6. ]]

(3, 3)


[[1.-2.j 3.+1.j 1.+0.j]
[1.+2.j 2.-1.j 7.+0.j]]

(2, 3)



ファイル(.txt) 保存

  • floating フォーマット

    123.4567 => “%0.4f”

  • scientific フォーマット

    1.23e2 => “%0.2e”


1
2
3
4
5
6
7
d = np.genfromtxt("Save/input2.txt", delimiter=" ", dtype=np.complex128)

np.savetxt("Save/output.txt", d , fmt="%0.4e", delimiter="," ) # 保存するパス, 保存する行列, フォーマット, 区切り文字の順序である。

d = np.genfromtxt("Save/output.txt" , delimiter=",", dtype=np.complex128)

print(d)


1
2
[[1.-2.j 3.+1.j 1.+0.j]
[1.+2.j 2.-1.j 7.+0.j]]
この記事は著者の CC BY 4.0 ライセンスの下で提供されています。