C Matlab python での 2次元配列 比較
2次元配列の書き方
C言語
int x[3][3] = {{0}, {0}}; int i, j; for (i=0; i<3; i++){ for(j=0; j<3; j++){ x[i][j] = i + j; } } for (i=0; i<3; i++){ for(j=0; j<3; j++){ printf("%d ", x[i][j]); } printf("\n"); }
output
0 1 2 1 2 3 2 3 4
Matlab
x = zeros(3, 3) for i = 1: 3 for j = 1: 3 x(i, j) = i + j end end
python (list)
# x = [[0]*3]*3 # NG x = [[0]*3 for i in range(3)] for i in range(3): for j in range(3): x[i][j] = i + j print(x)
output
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
python (numpy)
import numpy as np x = np.zeros([3, 3]) for i in range(3): for j in range(3): x[i, j] = i + j print(x)
output
[[0. 1. 2.] [1. 2. 3.] [2. 3. 4.]]
Cとmatlabは1次元配列と同じ要領で、2次元配列を作ることができる。
python では、リスト内包表記で初期化する必要がある。
pythonの(2次元)リストは、文字列なども格納できるため便利だが、数値のみを格納する場合は、素直にnumpyを使った方が簡単である。
複雑なテーブルを作成する場合
pythonでは、 pandas の DataFrame 利用することを推奨する。
Matlabでは、table が利用できる。( 2013b 以降 )
解説:
python の2次元 list を作ろうとする場合、初期化で
x = [[0]*3]*3 # NG
としたくなるが、この場合、外側の[~]*3で中の3つの要素(アドレス)がコピーされる。
(この場合、x = [[x1, x2, x3], [x1, x2, x3], [x1, x2, x3]] のような状態)
ここに、例えば"x1=5"と数値を入れると、3つのx1がすべて5になる。
(x = [[5, x2, x3], [5, x2, x3], [5, x2, x3]] )
上の例では、次の結果となる。
python (list)
x = [[0]*3]*3 # NG for i in range(3): for j in range(3): x[i][j] = i + j print(x)
output
[[2, 3, 4], [2, 3, 4], [2, 3, 4]]