アレイ(ベクトル・行列・アレイ)の扱いを覚える〜私のためのpythonメモ

  • アレイの基礎
    • '[x1,x2,...,]'がベクトルで、これの入れ子構造が、多次元ベクトル
    • numpyのアレイは、これを「numpyのarray」という取扱い形式に乗せたもの
# まず、入れ子ベクトルを作り
v1 = [1,2,3]
m1 = [v1,v1]
a1 = [m1,m1,m1]
# numpy arrayにする
V1 = np.array(v1)
M1 = np.array(m1)
A1 = np.array(a1)
V1
Out[112]: array([1, 2, 3])

M1
Out[113]: 
array([[1, 2, 3],
       [1, 2, 3]])

A1
Out[114]: 
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]]])

Out[115]: 2

V1.ndim
Out[116]: 1

V1.shape
Out[117]: (3,)

len(V1)
Out[118]: 3

M1.ndim
Out[119]: 2

M1.shape
Out[120]: (2, 3)

len(M1)
Out[121]: 2

A1.ndim
Out[122]: 3

A1.shape
Out[123]: (3, 2, 3)

len(A1)
Out[124]: 3
  • 1,2,3次元グリッドを作る
    • 1次元グリッド
# 1次元グリッド
# 0始まりの整数列(n-1)までのn個の整数
# + .0 は浮動小数点への型変換
n = 10
g1 = arange(n) + .0
g1
# [0,1]に範囲変換
g1_1 = g1/max(g1)
g1_1
# それらしい関数を使ってもよい
g1_1_1 = np.linspace(0,1,n)
g1_1_1
# 任意範囲
a = -3
b = 1
g1_2 = np.linspace(a,b,n)
g1_2
g1_2
array([-3.        , -2.55555556, -2.11111111, -1.66666667, -1.22222222,
       -0.77777778, -0.33333333,  0.11111111,  0.55555556,  1.        ])
    • 2次元にする
# 1次元グリッドを作る
g1 = np.linspace(0,1,n)
# 2次元化する
# 2次元アレイを二つ作る。x座標を納めたアレイとy座標を納めたアレイ
g2_x,g2_y = meshgrid(g1, g1, sparse=True)
z = g2_x + g2_y * 2
mp.pyplot.contourf(g1,g1,z)

  • 任意次元のアレイを作る
d = [2,3,4]
a1 = np.array(repeat(0.,prod(d))).reshape(d)
a1
Out[179]: 
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
    • こうもできる
np.zeros(d)
Out[180]: 
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
np.ones(d)
Out[181]: 
array([[[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]]])
  • 対角行列は使う
np.diag([1,2,3])
Out[185]: 
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
np.diag(repeat(1.,3))
Out[183]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
np.eye(3) # これでもOK
Out[184]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
  • こんなこともできる
np.diag([1,2,3],k=1)
Out[187]: 
array([[0, 1, 0, 0],
       [0, 0, 2, 0],
       [0, 0, 0, 3],
       [0, 0, 0, 0]])

np.diag([1,2,3],k=-1)
Out[188]: 
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0]])

np.diag([1,2,3],k=-2)
Out[189]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 2, 0, 0, 0],
       [0, 0, 3, 0, 0]])