web-dev-qa-db-ja.com

Pythonで多次元配列を定義するにはどうすればよいですか?

MATLABには、多次元配列を定義する簡単な方法があります。

A(:,:,1) = [1,2,3; 4,5,6];
A(:,:,2) = [7,8,9; 10,11,12];

>> A

 A(:,:,1) =

 1     2     3
 4     5     6


 A(:,:,2) =

 7     8     9
 10    11    12

ここで、最初の2つのインデックスは、それぞれ、Aに格納されているi番目の行列(またはページ、下の図を参照)の行と列です。

enter image description here

Pythonで同じ構造を定義する方法を知っている人はいますか?

8
S88S

numPyのインデックス付けはMATLABに似ています

 import numpy as np
 A=np.empty((2,3,3))
 A.shape
 #(2L, 3L, 3L)
 A[0,1,2] # element at index 0,1,2
 #0.0
 A[0,:,:] # 3x3 slice at index 0
 #array([[ 0.,  0.,  0.],
 #       [ 0.,  0.,  0.],
 #       [ 0.,  0.,  0.]])
 A[1,1,:] # 1-D array of length 3
 #array([ 0.,  0.,  0.]
10
Sandipan Dey

これを行う純粋なPythonの方法は、リストのリスト(またはこの場合はリストのリストのリスト)を使用することです。リスト内包表記で初期化できます。例えば:

w = 4 #width
h = 3 #height
d = 3 #depth

data = [[[0]*h for _ in range(w)] for _ in range(d)]

または、テンソルを図のようなタプルで埋めたい場合:

data = [[[(i+1,j+1,k+1) for k in range(h)] for j in range(w)] for i in range(d)]

これにより、ゼロで満たされたd x w x h "matrix"が初期化されます。

次に、次のコマンドで(i,j,k)番目の要素にアクセスできます。

data[i][j][k]

それにもかかわらず、ベクトル、行列、テンソルなどをサポートする numpy のようなライブラリがあります。

8

NumPy を使用する場合は、 多くの方法 があります。 1つの方法は、すべてゼロで初期化するか、更新された例のように、範囲を入力してから reshape にすることもできます。

import numpy as np

a = np.arange(48, dtype=np.int64).reshape((3, 4, 4))
# or 
b = np.zeros((3, 4, 4), dtype=np.int64)
2
roganjosh