overflow33の日記

python 機械学習 系の記事を書いて行きたい所存

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]]

参考:
Pythonのリスト(配列)を任意の値・要素数で初期化 | note.nkmk.me