情報学部 | 菅沼ホーム | 目次 | 索引 |
01 >>> import numpy as np # この方法が良く利用される 02 >>> x = np.array([1, 2, 3]) # (1 行 3 列) or (3 行 1 列) ? 03 >>> z = np.array([1.0, 2, 3]) 04 >>> y = np.array([[1, 2, 3], [4, 5, 6]], np.float) 05 >>> x.dtype, y.dtype, z.dtype 06 (dtype('int32'), dtype('float64'), dtype('float64')) 07 >>> x.ndim, y.ndim 08 (1, 2) 09 >>> x.shape, y.shape 10 ((3,), (2, 3)) 11 >>> u = np.array([[1, 2, 3]]) # 1 行 3 列 12 >>> v = np.array([[1], [2], [3]]) # 3 行 1 列 13 >>> u.shape, v.shape 14 ((1, 3), (3, 1))
>>> import numpy as np # この方法が良く利用される >>> np.zeros(2) array([ 0., 0.]) >>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]]) >>> np.ones(3) array([ 1., 1., 1.]) >>> np.empty(3) array([ 0., 0., 0.]) >>> a = np.array([1, 2, 3]) >>> a array([1, 2, 3]) >>> np.zeros_like(a) array([0, 0, 0])
>>> import numpy as np # この方法が良く利用される >>> np.arange(0, 5) array([0, 1, 2, 3, 4]) >>> np.array([np.arange(1, 4), np.arange(4, 7)]) array([[1, 2, 3], [4, 5, 6]])
>>> import numpy as np # この方法が良く利用される >>> v = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> w = v # 代入 >>> w[1][2] = 100 # w の要素の値を変更 >>> w array([[ 1, 2, 3], [ 4, 5, 100], [ 7, 8, 9]]) >>> v array([[ 1, 2, 3], [ 4, 5, 100], # v の値も変化 [ 7, 8, 9]]) >>> x = v.copy() # v の深いコピーを生成 >>> x[1][2] = 200 # x の要素の値を変更 >>> x array([[ 1, 2, 3], [ 4, 5, 200], # x の値だけが変化 [ 7, 8, 9]]) >>> v array([[ 1, 2, 3], [ 4, 5, 100], [ 7, 8, 9]]) >>> w array([[ 1, 2, 3], [ 4, 5, 100], [ 7, 8, 9]])
>>> import numpy as np # この方法が良く利用される >>> v = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> v array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> np.diag(v) array([1, 5, 9]) >>> np.diag(v, k = 1) array([2, 6]) >>> np.diag(v, k = -1) array([4, 8])
>>> import numpy as np # この方法が良く利用される >>> np.eye(3, 4) array([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.]]) >>> np.eye(3, 4, k = -1) array([[ 0., 0., 0., 0.], [ 1., 0., 0., 0.], [ 0., 1., 0., 0.]])
>>> import numpy as np # この方法が良く利用される >>> np.identity(3) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])
>>> import numpy as np # この方法が良く利用される >>> np.linspace(0, 4, 9) array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])
>>> import numpy as np # この方法が良く利用される >>> np.random.randint(0,100,10) array([ 4, 79, 4, 27, 52, 19, 15, 31, 63, 88])
>>> import numpy as np # この方法が良く利用される >>> np.tile([1, 2], 3) array([1, 2, 1, 2, 1, 2])
>>> import numpy as np # この方法が良く利用される >>> np.tri(3, k = 0) array([[ 1., 0., 0.], [ 1., 1., 0.], [ 1., 1., 1.]]) >>> np.tri(3, k = 1) array([[ 1., 1., 0.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.tri(3, k = -1) array([[ 0., 0., 0.], [ 1., 0., 0.], [ 1., 1., 0.]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> a[1][2] = 10 >>> a array([[ 1, 2, 3], [ 4, 5, 10]]) >>> a[0][1:3] = [20, 20] # a[0][1:3] = 20 でも同じ >>> a array([[ 1, 20, 20], [ 4, 5, 10]]) >>> a[2:4] = [20, 20] # 不可能( 1 次元配列としては処理できない)
>>> import numpy as np # この方法が良く利用される >>> a = np.array([1, 2, 3, 4, 5, 6]) >>> a[[0, 2, 4]] # 添え字 0,2,4 の要素からなる配列 array([1, 3, 5]) >>> a > 3 # 各要素と 3 を比較した結果から構成される配列 array([False, False, False, True, True, True], dtype=bool) >>> a[a > 3] # 3 より大きい要素から構成される配列 array([4, 5, 6]) >>> a[a > 3] = 100 # 3 より大きい要素に 100 を代入 >>> a array([ 1, 2, 3, 100, 100, 100])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([1.2, 2.3, 3.14]) >>> b = a.astype(np.int) >>> a array([ 1.2 , 2.3 , 3.14]) >>> a.dtype dtype('float64') >>> b array([1, 2, 3]) >>> b.dtype dtype('int32')
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> b = a.flatten() >>> a array([[1, 2, 3], [4, 5, 6]]) >>> b array([1, 2, 3, 4, 5, 6])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> b = np.reshape(a, 6) >>> b array([1, 2, 3, 4, 5, 6]) >>> a[0][2] = 10 >>> a array([[ 1, 2, 10], [ 4, 5, 6]]) >>> b array([ 1, 2, 10, 4, 5, 6])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> b = np.resize(a, 6) >>> b array([1, 2, 3, 4, 5, 6]) >>> a[0][2] = 10 >>> a array([[ 1, 2, 10], [ 4, 5, 6]]) >>> b array([1, 2, 3, 4, 5, 6]) # インスタントメソッド >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> a.resize(6) >>> a array([1, 2, 3, 4, 5, 6]) >>> a.resize(8) # 不可能 >>> a.resize(8, refcheck = False) >>> a array([1, 2, 3, 4, 5, 6, 0, 0])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> a.transpose() array([[1, 4], [2, 5], [3, 6]]) >>> b = np.array([[1, 2, 3]]) >>> b array([[1, 2, 3]]) >>> b.transpose() array([[1], [2], [3]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 0, 0], [3, 3, 0]]) >>> a.argmax() 3 # a を 1 次元配列としてみた位置 >>> a.argmin() 1 >>> a.nonzero() # a[0][0], a[1][0],a[1][1] (array([0, 1, 1], dtype=int32), array([0, 0, 1], dtype=int32)) >>> np.where(a > 2) # a[1][0],a[1][1] (array([1, 1], dtype=int32), array([0, 1], dtype=int32)) >>> np.where([True, False, True], [1, 2, 3], [10, 20, 30]) array([ 1, 20, 3])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2], [3, 4]]) >>> b = np.array([[1, 0], [0, 1]]) >>> a + b array([[2, 2], [3, 5]]) >>> a * b array([[1, 0], [0, 4]]) >>> a ** 2 array([[ 1, 4], [ 9, 16]]) >>> a * 2 array([[2, 4], [6, 8]]) >>> a / 2 array([[ 0.5, 1. ], [ 1.5, 2. ]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2], [3, 4]]) >>> np.sqrt(a) array([[ 1. , 1.41421356], [ 1.73205081, 2. ]])
>>> import numpy as np # この方法が良く利用される >>> A = np.matrix([[1, 2], [3, 4]]) # 2 行 2 列の行列 >>> B = np.matrix([[1, 0], [0, 1]]) # 2 行 2 列の行列 >>> A * B # 行列の積 matrix([[1, 2], [3, 4]]) >>> A * 2 # スカラーをかける matrix([[2, 4], [6, 8]]) >>> A / 2 # スカラーで割る matrix([[ 0.5, 1. ], [ 1.5, 2. ]]) >>> A ** 2 # A * A matrix([[ 7, 10], [15, 22]]) >>> u = np.matrix([[1, 2, 3]]) # 1 行 3 列の行列(行ベクトル) >>> v = np.matrix([[1], [2], [3]]) # 3 行 1 列の行列(列ベクトル) >>> u * v # 行列の積(内積に相当する演算) matrix([[14]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> np.savetxt('test.txt', a) >>> b = np.loadtxt('test.txt') >>> b array([[ 1., 2., 3.], [ 4., 5., 6.]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> np.save('test_data', a) >>> b = np.load('test_data.npy') >>> b array([[1, 2, 3], [4, 5, 6]])
>>> import numpy as np # この方法が良く利用される >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> b = np.array([10, 20, 30]) >>> np.savez('test_data', x = a, y = b) >>> data = np.load('test_data.npz') >>> data.files ['y', 'x'] >>> data['x'] array([[1, 2, 3], [4, 5, 6]]) >>> data['y'] array([10, 20, 30])
list
# -*- coding: UTF-8 -*- # file 入出力 f = open("test.txt", "w") # 出力 f.write("1 2 3\n") f.write("4 5 6\n") f.close() f = open("test.txt", "r") # 入力 A = [[], []] for i1 in range(0, 2): A[i1] = f.readline().split() for i2 in range(0, 3): x = int(A[i1][i2]) A[i1][i2] = x; f.close() print("*** A ***") print(A) # 設定 B = [[0, 0, 0], [4, 5, 6]] print("*** B ***") print(B) C = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] print("*** C ***") print(C) # 演算 print("*** A+B ***") print(A+B) # 行列の加算ではない print("*** A-B ***") print(" 不可能") print("*** A*B ***") print(" 不可能") print("*** sqrt(A) ***") print(" 不可能")
*** A *** [[1, 2, 3], [4, 5, 6]] *** B *** [[0, 0, 0], [4, 5, 6]] *** C *** [[1, 0, 0], [0, 1, 0], [0, 0, 1]] *** A+B *** [[1, 2, 3], [4, 5, 6], [0, 0, 0], [4, 5, 6]] *** A-B *** 不可能 *** A*C *** 不可能 *** sqrt(A) *** 不可能
array
# -*- coding: UTF-8 -*- from array import * # file 入出力 f = open("test.txt", "w") # 出力 f.write("1 2 3\n") f.write("4 5 6\n") f.close() f = open("test.txt", "r") # 入力 A = [array("f", [0, 0, 0]), array("f", [0, 0, 0])] for i1 in range(0, 2): x = f.readline().split() for i2 in range(0, 3): y = float(x[i2]) A[i1][i2] = y; f.close() print("*** A ***") print(A) # 設定 B = [array("f", [0, 0, 0]), array("f", [4, 5, 6])] print("*** B ***") print(B) C = [array("f", [1, 0, 0]), array("f", [0, 1, 0]), array("f", [0, 0, 1])] print("*** C ***") print(C) # 演算 print("*** A+B ***") print(A+B) # 行列の加算ではない print("*** A-B ***") print(" 不可能") print("*** A*B ***") print(" 不可能") print("*** sqrt(A) ***") print(" 不可能")
*** A *** [array('f', [1.0, 2.0, 3.0]), array('f', [4.0, 5.0, 6.0])] *** B *** [array('f', [0.0, 0.0, 0.0]), array('f', [4.0, 5.0, 6.0])] *** C *** [array('f', [1.0, 0.0, 0.0]), array('f', [0.0, 1.0, 0.0]), array('f', [0.0, 0.0, 1.0])] *** A+B *** [array('f', [1.0, 2.0, 3.0]), array('f', [4.0, 5.0, 6.0]), array('f', [0.0, 0.0, 0.0]), array('f', [4.0, 5.0, 6.0])] *** A-B *** 不可能 *** A*B *** 不可能 *** sqrt(A) *** 不可能
NymPy array
# -*- coding: UTF-8 -*- import numpy as np # file 入出力 np.savetxt('test.txt', np.array([[1, 2, 3], [4, 5, 6]])) # 出力 A = np.loadtxt('test.txt') # 入力 print("*** A ***") print(A) # 設定 B = np.array([[0, 0, 0], [4, 5, 6]]) print("*** B ***") print(B) C = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) print("*** C ***") print(C) # 演算 print("*** A+B ***") print(A+B) # 行列の加算 print("*** A-B ***") print(A-B) # 行列の減算 print("*** A*B ***") print(A*B) # 行列の乗算ではない print("*** A*C ***") print(" 不可能") print("*** sqrt(A) ***") print(np.sqrt(A)) # ユニバーサル関数
*** A *** [[ 1. 2. 3.] [ 4. 5. 6.]] *** B *** [[0 0 0] [4 5 6]] *** C *** [[1 0 0] [0 1 0] [0 0 1]] *** A+B *** [[ 1. 2. 3.] [ 8. 10. 12.]] *** A-B *** [[ 1. 2. 3.] [ 0. 0. 0.]] *** A*B *** [[ 0. 0. 0.] [ 16. 25. 36.]] *** A*C *** 不可能 *** sqrt(A) *** [[ 1. 1.41421356 1.73205081] [ 2. 2.23606798 2.44948974]]
NymPy matrix
# -*- coding: UTF-8 -*- import numpy as np # file 入出力 np.savetxt('test.txt', np.matrix([[1, 2, 3], [4, 5, 6]])) # 出力 A = np.loadtxt('test.txt') # 入力 print("*** A ***") print(A) # 設定 B = np.matrix([[0, 0, 0], [4, 5, 6]]) print("*** B ***") print(B) C = np.matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) print("*** C ***") print(C) # 演算 print("*** A+B ***") print(A+B) # 行列の加算 print("*** A-B ***") print(A-B) # 行列の減算 print("*** A*B ***") print(" 不可能") print("*** A*C ***") print(A*C) # 行列の乗算 print("*** sqrt(A) ***") print(np.sqrt(A)) # ユニバーサル関数
*** A *** [[ 1. 2. 3.] [ 4. 5. 6.]] *** B *** [[0 0 0] [4 5 6]] *** C *** [[1 0 0] [0 1 0] [0 0 1]] *** A+B *** [[ 1. 2. 3.] [ 8. 10. 12.]] *** A-B *** [[ 1. 2. 3.] [ 0. 0. 0.]] *** A*B *** 不可能 *** A*C *** [[ 1. 2. 3.] [ 4. 5. 6.]] *** sqrt(A) *** [[ 1. 1.41421356 1.73205081] [ 2. 2.23606798 2.44948974]]
C++ の場合
/**********************/ /* クラスMatrixの定義 */ /**********************/ class Matrix { /* 2次元行列 */ int n; // 行の数 int m; // 列の数 public: double **mat; // 行列本体 Matrix(int, int, double **); // コンストラクタ(引数 3) Matrix(int, int); // コンストラクタ(引数 2) Matrix(const Matrix &); // 初期化のためのコンストラクタ Matrix() {n = 0;} // コンストラクタ(引数無し) ~Matrix() // デストラクタ { if (n > 0) { int i1; for (i1 = 0; i1 < n; i1++) delete [] mat[i1]; delete [] mat; } } Matrix &operator= (const Matrix &); // =のオーバーロード Matrix operator+ (const Matrix &); // +のオーバーロード Matrix operator- (const Matrix &); // -のオーバーロード Matrix operator* (const Matrix &); // *のオーバーロード friend ostream &operator << (ostream &, Matrix); // << のオーバーロード friend Matrix sqrt(const Matrix &); // 各要素の平方根 }; /****************************/ /* コンストラクタ(引数 3) */ /****************************/ Matrix::Matrix(int n1, int m1, double **x) { n = n1; m = m1; mat = new double * [n]; for (int i1 = 0; i1 < n; i1++) { mat[i1] = new double [m]; for (int i2 = 0; i2 < m; i2++) mat[i1][i2] = x[i1][i2]; } } /****************************/ /* コンストラクタ(引数 2) */ /****************************/ Matrix::Matrix(int n1, int m1) { n = n1; m = m1; mat = new double * [n]; for (int i1 = 0; i1 < n; i1++) mat[i1] = new double [m]; } /********************************/ /* 初期化のためのコンストラクタ */ /********************************/ Matrix::Matrix(const Matrix &A) { n = A.n; m = A.m; mat = new double * [n]; for (int i1 = 0; i1 < n; i1++) { mat[i1] = new double [m]; for (int i2 = 0; i2 < m; i2++) mat[i1][i2] = A.mat[i1][i2]; } } /********************************/ /* 出力( << のオーバーロード) */ /********************************/ ostream &operator << (ostream &stream, Matrix A) { for (int i1 = 0; i1 < A.n; i1++) { for (int i2 = 0; i2 < A.m; i2++) stream << " " << A.mat[i1][i2]; stream << "\n"; } return stream; } /*******************************/ /* =のオーバーロード */ /* A = B (A.operator=(B)) */ /*******************************/ Matrix& Matrix::operator= (const Matrix &B) { if (&B != this) { // 自分自身への代入を防ぐ if (n > 0) { // 代入する前のメモリを解放 for (int i1 = 0; i1 < n; i1++) delete [] mat[i1]; delete [] mat; } n = B.n; m = B.m; mat = new double * [n]; // メモリの確保と代入 for (int i1 = 0; i1 < n; i1++) { mat[i1] = new double [m]; for (int i2 = 0; i2 < m; i2++) mat[i1][i2] = B.mat[i1][i2]; } } return *this; } /**********************/ /* +のオーバーロード */ /**********************/ Matrix Matrix::operator + (const Matrix &B) { if (n != B.n || m != B.m) { cout << "***error invalid data\n"; exit(1); } Matrix C(n, m); for (int i1 = 0; i1 < n; i1++) { for (int i2 = 0; i2 < m; i2++) C.mat[i1][i2] = mat[i1][i2] + B.mat[i1][i2]; } return C; } /**********************/ /* -のオーバーロード */ /**********************/ Matrix Matrix::operator - (const Matrix &B) { if (n != B.n || m != B.m) { cout << "***error invalid data\n"; exit(1); } Matrix C(n, m); for (int i1 = 0; i1 < n; i1++) { for (int i2 = 0; i2 < m; i2++) C.mat[i1][i2] = mat[i1][i2] - B.mat[i1][i2]; } return C; } /**********************/ /* *のオーバーロード */ /**********************/ Matrix Matrix::operator* (const Matrix &B) { if (m != B.n) { cout << "***error invalid data\n"; exit(1); } Matrix C(n, B.m); for (int i1 = 0; i1 < n; i1++) { for (int i2 = 0; i2 < B.m; i2++) { C.mat[i1][i2] = 0.0; for (int i3 = 0; i3 < m; i3++) C.mat[i1][i2] += mat[i1][i3] * B.mat[i3][i2]; } } return C; } /******************/ /* 各要素の平方根 */ /******************/ Matrix sqrt(const Matrix &A) { Matrix C(A.n, A.m); for (int i1 = 0; i1 < A.n; i1++) { for (int i2 = 0; i2 < A.m; i2++) C.mat[i1][i2] = sqrt(A.mat[i1][i2]); } return C; }
main プログラム
int main() { // file 入出力 FILE *out = fopen("test.txt", "w"); // 出力 for (double i1 = 1; i1 <= 3; i1++) fprintf(out, " %f", i1); fprintf(out, "\n"); for (double i1 = 4; i1 <= 6; i1++) fprintf(out, " %f", i1); fprintf(out, "\n"); fclose(out); FILE *in = fopen("test.txt", "r"); // 入力 double **x = new double *[2]; for (int i1 = 0; i1 < 2; i1++) { x[i1] = new double [3]; fscanf(in, "%lf %lf %lf", &x[i1][0], &x[i1][1], &x[i1][2]); } fclose(in); Matrix A(2, 3, x); // 設定 Matrix B = A; for (int i1 = 0; i1 < 3; i1++) B.mat[0][i1] = 0; double **z = new double *[3]; z[0] = new double [3]; z[0][0] = 1; z[0][1] = 0; z[0][2] = 0; z[1] = new double [3]; z[1][0] = 0; z[1][1] = 1; z[1][2] = 0; z[2] = new double [3]; z[2][0] = 0; z[2][1] = 0; z[2][2] = 1; Matrix C(3, 3, z); // 演算 cout << "*** A ***\n" << A; cout << "*** B ***\n" << B; cout << "*** C ***\n" << C; cout << "*** A+B ***\n" << A+B; // 行列の加算 cout << "*** A-B ***\n" << A-B; // 行列の減算 cout << "*** A*C ***\n" << A*C; // 行列の乗算 cout << "*** sqrt(A) ***\n" << sqrt(A); // ユニバーサル関数 return 0; }
*** A *** 1 2 3 4 5 6 *** B *** 0 0 0 4 5 6 *** C *** 1 0 0 0 1 0 0 0 1 *** A+B *** 1 2 3 8 10 12 *** A-B *** 1 2 3 0 0 0 *** A*C *** 1 2 3 4 5 6 *** sqrt(A) *** 1 1.41421 1.73205 2 2.23607 2.44949
情報学部 | 菅沼ホーム | 目次 | 索引 |