読者です 読者をやめる 読者になる 読者になる

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.])


終わり。