hakeの日記

Windows環境でプログラミングの勉強をしています。

python - numpyの初歩

numpyの基本的な機能確認
python のバージョンは 3.6.4

import numpy as np

# listとndarrayの相互変換
a = [[1,2],[3,4]]
b = np.array(a)
print(repr(b)) # array([[1,2],[3,4]])
c = b.tolist()
print(c)       # [[1,2],[3,4]]

# データ型
print(b.dtype)  # int32
# 次元
print(b.ndim)   # 2
# 要素数
print(b.size)   # 4
# 行列数
print(b.shape)  # (2, 2)

# ndarrayの生成
a = np.arange(8, dtype=int) # end, type
print(repr(a))        # array([0, 1, 2, 3, 4, 5, 6, 7])
a = np.arange(1,19,2) # begin, end, step
print(repr(a))        # array([ 1,  3,  5,  7,  9, 11, 13, 15, 17])

# 行列構成変更
b = a.reshape((3,3))  # tupleで指定
print(repr(b))        # array([[1, 3, 5],[7, 9, 11],[13, 15, 17]])

# スライス
print(b[0])        # [1,3,5]
print(b[0][0])     # 1
print(b[0,0])      # 1
print(b[0][:2])    # [1,3]
print(b[1:])       # [[7, 9, 11],[13, 15, 17]]
print(b[1:][:2])   # [[7, 9, 11],[13, 15, 17]] これは上手くいかない


# 等間隔な数列
a = np.linspace(0,2,5)# start,end,size
print(repr(a))        # array([0. , 0.5, 1. , 1.5, 2. ])
a = np.linspace(0,2,5,endpoint = False)
print(repr(a))        # array([0. , 0.4, 0.8, 1.2, 1.6])

# 乱数
a = np.random.random(4) # 要素数(0 <= n < 1.0)
print(repr(a))          # array([0.44478423, 0.87792819,
                        #        0.35577869, 0.05965164])
a = np.random.randint(0,10,5) # begin,end,size
print(repr(a))          # array([7, 5, 8, 0, 1])

# ソート
b = np.sort(a)
print(repr(b))          # array([0, 1, 5, 7, 8])
b = np.sort(a)[::-1]    # 降順
print(repr(b))          # array([8, 7, 5, 1, 0])

c = np.argsort(a)       # index順を返す
print(repr(c))          # array([3, 4, 1, 0, 2], dtype=int32)
print(repr(a[c[:]]))    # array([0, 1, 5, 7, 8])
                        # indexを参照してソート

# 多次元ソート
a = np.random.randint(0, 10, (3,2))
print( repr(a) )           # array([[4, 0],[8, 3],[1, 5]])
print( repr( np.sort(a) )) # array([[0, 4],[3, 8],[1, 5]])
                           # axis=-1で各行を個々にソート
print( repr( np.sort(a, axis = 0) )) 
                           # array([[1, 0],[4, 3],[8, 5]])
                           # 各列を個々にソート

# 四則演算
a = np.array([1,2,3])
b = np.array([4,5,6])
print( repr(np.add(a,b)) )       # array([5, 7, 9])
print( repr(np.subtract(a,b)) )  # array([-3, -3, -3])
print( repr(np.multiply(a,b)) )  # array([ 4, 10, 18])
print( repr(np.divide(b,a)) )    # array([4. , 2.5, 2. ])

# 各種計算
print( np.sum(a) )       # 6
print( np.mean(a) )      # 2.0
print( np.max(a) )       # 3
print( np.min(a) )       # 1
print( np.var(a) )       # 0.6666666666666666 分散
print( np.all(a) )       # True 全て真
print( np.any(a) )       # True 何れかが真

# 行列の積
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print( repr(a.dot(b)) )  # array([[19, 22],[43, 50]])

# 転置行列
a = np.arange(1,5).reshape((2,2))
print(repr(a))                 # array([[1, 2],[3, 4]])
print(repr(a.T))               # array([[1, 3],[2, 4]])
print(repr(np.transpose(a)))   # array([[1, 3],[2, 4]])

# 0行列
a = np.zeros((2,2), dtype=int)
print(repr(a))        # array([[0, 0],[0, 0]])

# 1行列
a = np.ones((2,2), dtype=int)
print(repr(a))        # array([[1, 1],[1, 1]])

# 単位行列
a = np.identity(3, dtype=int)
print(repr(a))        # array([[1, 0, 0],[0, 1, 0],[0, 0, 1]])