-Python- Numpy 配列の転置

numpy.adarray.T を利用して,配列の転置を取得することができます.当然ですが,天地を取った配列の次元は,元の配列の逆順になります.
以下に例を示します.
 
2次元配列の例
>>> import numpy as np
>>> A = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(A)
[[1 2 3]
 [4 5 6]]
>>> print(A.shape)
(2, 3)
>>> # shapeも変更される
... print(A.T.shape)
(3, 2)
 
3次元配列の例

>>> # 3次元配列を生成
... B = np.array([[[1, 2], [3, 4], [5, 6]]])
>>> print(B)
[[[1 2]
  [3 4]
  [5 6]]]
>>> # 3次元配列の転置
... print(B.T)
[[[1]
  [3]
  [5]]
 
 [[2]
  [4]
  [6]]]
>>> print(B.shape)
(1, 3, 2)
>>> print(B.T.shape)
(2, 3, 1)

転置を取るプログラム例を以下に示します.
 
import numpy as np
 
# Create two-dimensional array A
A = np.array([[123], [456]])
print('Two-dimensional array A')
print(A)
print('Shape of array A')
print(A.shape)
 
# Transposition of two-dimensional array A
print('Transposed two-dimensional array A')
print(A.T)
print('Shape of transposed array A')
print(A.T.shape)
 
# Create three-dimensional array B
B = np.array([[78], [910], [1112]])
print('Two-dimensional array B')
print(B)
print('Transposed three-dimensional array B')
print('Shape of array B')
print(B.shape)
 
# Transposition of three-dimensional array B
print('Transposed two-dimensional array B')
print(B.T)
print('Shape of transposed array B')
 
print(B.T.shape)
 
上記のプログラムを"transpose.py"という名前で保存して,実行すると以下のようになります.
$ python transpose.py
Two-dimensional array A
[[1 2 3]
 [4 5 6]]
Shape of array A
(2, 3)
Transposed two-dimensional array A
[[1 4]
 [2 5]
 [3 6]]
Shape of transposed array A
(3, 2)
Two-dimensional array B
[[ 7  8]
 [ 9 10]
 [11 12]]
Transposed three-dimensional array B
Shape of array B
(3, 2)
Transposed two-dimensional array B
[[ 7  9 11]
 [ 8 10 12]]
Shape of transposed array B
(2, 3)

また,
    numpy.ndarray.reshape()
メソッドを利用することで要素数が変わらない範囲でndarrayの形状を変更できます.

# (2, 3) -> (1, 6)
print('Transform array A from (2, 3) to (1, 6)')
print(A.reshape(16))
 
Transform array A from (2, 3) to (1, 6)

形状が同じ ndarray 同士に対しては四則演算が適用でき,その結果は要素毎の四則演算となります.また,データ型は大きい方に一致します.

# Four arithmetic operations
print('Array A')
print(A)
print('Array C')
C = np.ones*1
print(C)
 
print('A + C')
print(A + C)
print('A - C')
print(A - C)
print('A * C (This is not matrix product)')
print(A * C)
print('C / A')
print(C / A)

実行結果は,以下のようになります.
Array A
[[1 2 3]
 [4 5 6]]
Array C
[[1. 1. 1.]
 [1. 1. 1.]]
A + C
[[2. 3. 4.]
 [5. 6. 7.]]
A - C
[[0. 1. 2.]
 [3. 4. 5.]]
A * C (This is not matrix product)
[[1. 2. 3.]
 [4. 5. 6.]]
C / A
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
上記の例でもわかるように,"*"演算では行列積にはなりません.

内積計算は,以下のようにして行います.
# Inner product
a = np.array([12])
b = np.array([34])
print('Vector a')
print(a)
print('Vector b')
print(b)
print('a .dot b')
print(np.dot(a, b))

実行結果は以下のようになります.
[1 2]
[3 4]
a .dot b
11

行列積は,以下のようにして行います.
print('Array D')
D = np.ones*2
print(D)
print('A .dot D (This is matrix product)')
print(np.dot(A, D))

実行結果は以下のようになります.
Array D
[[1. 1.]
 [1. 1.]
 [1. 1.]]
A .dot D (This is matrix product)
[[ 6.  6.]
 [15. 15.]]
 
行列の四則演算において,配列のサイズが完全に一致していなくても,片方の次元の長さが1または0の場合は,同じ値によって自動的にサイズ拡張されて計算されます.
print('A')
print(A)
E = np.array([[123]])
print('E')
print(E)
print('Automatically size-expanded by the same value.')
print('A + E')
print(A + E)
実行結果は以下のようになります.
A
[[1 2 3]
 [4 5 6]]
E
Automatically size-expanded by the same value.
A + E
[[2 4 6]
 [5 7 9]]

行列Aと配列c*3の和
c = np.array([123])
print('c')
print(c)
print('A + c')
print(A + c)
この計算では,配列cは(1, 3)から(2, 3)に拡張されます.

実行結果は以下のようになります.

c
[1 2 3]
A + c
[[2 4 6]
 [5 7 9]]

*1:23

*2:32

*3:3,