NumPyとScipyを使ってみる
NumPyとScipyを使ってみたメモです。
REPLで実行しています。
NumPy
インポートして使い始めます。
>>> import numpy as np
2次元行列の生成。
>>> a = np.array([[1,2],[3,4]]) >>> a array([[1, 2], [3, 4]])
要素数を確認。
>>> a.size
4
行、列を確認。
>>> a.shape (2, 2)
range関数と同様に配列を生成出来ます。
>>> b = np.arange(10) >>> b array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2行、5列の行列に変換。
>>> c = b.reshape(2,5) >>> c array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
行列の足し算、引き算。
>>> a = np.arange(4).reshape(2,2) >>> a array([[0, 1], [2, 3]]) >>> b = np.arange(3,7).reshape(2,2) >>> b array([[3, 4], [5, 6]]) >>> a + b array([[3, 5], [7, 9]]) >>> a - b array([[-3, -3], [-3, -3]])
行列の転置。
>>> a.T array([[0, 2], [1, 3]]) >>> a.T + b array([[3, 6], [6, 9]])
行列の積。
>>> np.dot(a,b) array([[ 5, 6], [21, 26]]) >>> v = np.array([10,20]) >>> v array([10, 20]) >>> np.dot(a,v) array([20, 80]) >>> np.dot(v,a) array([40, 70])
配列のインデクシング。
>>> v = np.arange(10,15) >>> v array([10, 11, 12, 13, 14]) >>> v[2:4] array([12, 13]) >>> v[:3] array([10, 11, 12]) >>> v[3:] array([13, 14]) >>> v[:-1] array([10, 11, 12, 13]) >>> a = np.arange(1,5).reshape >>> a <built-in method reshape of numpy.ndarray object at 0x7f4cca043990> >>> a = np.arange(1,5).reshape(2,2) >>> a array([[1, 2], [3, 4]]) >>> u = a[0,:] >>> u array([1, 2]) >>> u = a[:,1] >>> u array([2, 4])
ブロードキャスティング。
>>> ii = np.array([2,3]) >>> v[ii] array([12, 13]) >>> w = np.array([False,False,False,True,True]) >>> v[w] array([13, 14]) >>> a * 2 array([[2, 4], [6, 8]]) >>> np.exp(a) array([[ 2.71828183, 7.3890561 ], [ 20.08553692, 54.59815003]]) >>> v < 13 array([ True, True, True, False, False], dtype=bool) >>> v[v<13] array([10, 11, 12])
行列の結合。
>>> a = np.arange(6).reshape(2,3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> b = np.arange(6,12).reshape(2,3) >>> b array([[ 6, 7, 8], [ 9, 10, 11]]) >>> np.c_[a,b] array([[ 0, 1, 2, 6, 7, 8], [ 3, 4, 5, 9, 10, 11]]) >>> np.r_[a,b] array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) >>> c = np.arange(3) >>> c array([0, 1, 2]) >>> d = np.arange(3,6) >>> d array([3, 4, 5]) >>> np.c_[c,d] array([[0, 3], [1, 4], [2, 5]]) >>> np.r_[c,d] array([0, 1, 2, 3, 4, 5])
Scipy
Scipyをインポート。
>>> from scipy import sparse
lil_matrixで疎行列を定義。
todense()で疎行列を密行列に変換。
>>> a = sparse.lil_matrix((5,5)) >>> a[0,0]=1; >>> a[1,2]=2 >>> a[3,4]=3 >>> a[4,4]=4 >>> a <5x5 sparse matrix of type '<class 'numpy.float64'>' with 4 stored elements in LInked List format> >>> a.todense() matrix([[ 1., 0., 0., 0., 0.], [ 0., 0., 2., 0., 0.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 3.], [ 0., 0., 0., 0., 4.]])
tocsr()で行方向に圧縮。
>>> b = a.tocsr() >>> b <5x5 sparse matrix of type '<class 'numpy.float64'>' with 4 stored elements in Compressed Sparse Row format> >>> b.getrow(1).todense() matrix([[ 0., 0., 2., 0., 0.]]) >>> v = np.array([1,2,3,4,5]) >>> a.dot(v) array([ 1., 6., 0., 15., 20.])
終わり。