| 情報学部 | 菅沼ホーム | 目次 | 索引 |
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
| 情報学部 | 菅沼ホーム | 目次 | 索引 |