Pythonによるデータ分析ノート-Numpyベース


チュートリアルに従ってしばらくの間データ分析を勉強して、学べば学ぶほど感じの穴が多くなります.そこで1週間かけて『Pythonによるデータ分析』をよく見ました.ここに書くのは主に記録して、自分で見るのが便利です.
import matplotlib.pyplot as plt
import numpy as np

n次元配列の作成
1、array関数の使用
最も簡単な方法はarray関数を使用して、リストなどのシーケンスを入力すればいいです.
#       
data = np.random.randn(2, 3)
data
array([[ 1.8878077 , -0.09071248, -0.17286876],
       [-1.39093014, -1.82384125,  0.82493751]])

各配列には、次元サイズを表すshapeがあります.dtypeはdata typeを表すために使用されます.
#     
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
arr2
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
print('    :',arr2.shape)
print('   :', arr2.ndim)
print('    :',arr2.dtype)
    : (2, 4)
   : 2
    : int32

自発的に宣言しない限りnp.arrayはdataに適切なタイプを自動的に組み合わせてdtypeに保存します
データ型を指定することもできます
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
print('arr1    :',arr1.dtype)
print('arr2    :',arr2.dtype)
arr1    : float64
arr2    : int32

タイプをastypeで変換すると、astypeは常に新しい配列を返します.
  • floatをintにすると、小数点以下の部分は
  • 捨てられる.
    int_arr1 = arr1.astype(np.int)
    int_arr1.dtype
    dtype('int32')
    

    2、その他の方法
    npを除いてarray、配列を作成できる他の関数もあります.例えばzeros,ones、また1つのtupleでshapeを指定することもできます
    np.zeros((3, 6))
    array([[0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0.]])
    
    # np.empty          0   ,     ,            ,   
    np.empty((2, 3, 2))
    array([[[5.63e-322, 0.00e+000],
            [0.00e+000, 0.00e+000],
            [0.00e+000, 0.00e+000]],
    
           [[0.00e+000, 0.00e+000],
            [0.00e+000, 0.00e+000],
            [0.00e+000, 0.00e+000]]])
    
    np.arange(10)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    

    はいれつけいさん
    配列が重要なのは,forループを書かずに多くの操作を表現できるためであり,この特性をvectorization(ベクトル化)と呼ぶ.2つのサイズが等しい配列間の演算は、element-wise(点対点)です.
    data = np.arange(5)
    print('*:', data*10)
    print('+:',data+data)
    *: [ 0 10 20 30 40]
    +: [0 2 4 6 8]
    
    #               :
    arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
    arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])
    arr2 > arr1
    array([[False,  True, False],
           [ True, False,  True]])
    

    索引とスライス
    1次元配列はlistと動作し、arrayのスライス後の結果はviews(ビュー)にすぎず、新しいarrayを作成するのではなく、既存のarrayに対応する要素を表すために使用されます.リストのスライスは新しいリストを生み出しました
    arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    arr2d[2]
    array([7, 8, 9])
    
    arr2d[2][1]
    8
    
    arr2d[:2]
    array([[1, 2, 3],
           [4, 5, 6]])
    
    #    ,     
    arr2d[:2, 1:]
    array([[2, 3],
           [5, 6]])
    
    arr2d[:2, 2]
    array([3, 6])
    
    #         axis( )
    arr2d[:, :1]
    array([[1],
           [4],
           [7]])
    
    #     
    arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
    arr3d
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    
    arr3d[1, 0]   #        x = arr3d[1], x[0]   
    array([7, 8, 9])
    

    ブール索引
    data = np.random.randn(7, 4)
    data
    array([[-1.33904841, -1.4637553 , -1.377123  ,  0.09439955],
           [ 1.40173772,  2.63681109, -2.11408761, -1.19171294],
           [-1.58056578,  0.22323485,  1.85082002, -0.76870622],
           [ 0.18076579, -0.24595339,  1.21591539,  0.30617942],
           [-0.80319239,  0.64991022, -0.46159542, -1.23788867],
           [ 1.16571902,  0.98157039, -1.3452736 ,  0.22940809],
           [-0.01013532, -0.31661346,  1.57364789,  0.05199267]])
    
    #        0
    data[data < 0] = 0
    data
    array([[0.        , 0.        , 0.        , 0.09439955],
           [1.40173772, 2.63681109, 0.        , 0.        ],
           [0.        , 0.22323485, 1.85082002, 0.        ],
           [0.18076579, 0.        , 1.21591539, 0.30617942],
           [0.        , 0.64991022, 0.        , 0.        ],
           [1.16571902, 0.98157039, 0.        , 0.22940809],
           [0.        , 0.        , 1.57364789, 0.05199267]])
    
    # ~    
    data[~(data < 0)] = 0
    data
    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.],
           [0., 0., 0., 0.]])
    

    花インデックス
    配列が何次元であるかにかかわらず、フラワーインデックスの結果は常に1次元であり、fancy indexingはスライスとは異なり、新しいarrayが得られることを覚えておいてください.
    #     8 x 4    
    arr = np.empty((8, 4))
    for i in range(8):
        arr[i] = i
    arr
    array([[0., 0., 0., 0.],
           [1., 1., 1., 1.],
           [2., 2., 2., 2.],
           [3., 3., 3., 3.],
           [4., 4., 4., 4.],
           [5., 5., 5., 5.],
           [6., 6., 6., 6.],
           [7., 7., 7., 7.]])
    
    #          ,   
    arr[[4, 3, 0, 6]]
    array([[4., 4., 4., 4.],
           [3., 3., 3., 3.],
           [0., 0., 0., 0.],
           [6., 6., 6., 6.]])
    
    #        
    arr[[-3, -5, -7]]
    array([[5., 5., 5., 5.],
           [3., 3., 3., 3.],
           [1., 1., 1., 1.]])
    
    arr = np.arange(32).reshape((8, 4))
    arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23],
           [24, 25, 26, 27],
           [28, 29, 30, 31]])
    
    #     [ 4, 23, 29, 10]    (1, 0), (5, 3), (7, 1), (2, 2)
    arr[[1, 5, 7, 2], [0, 3, 1, 2]]
    array([ 4, 23, 29, 10])
    
    arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
    array([[ 4,  7,  5,  6],
           [20, 23, 21, 22],
           [28, 31, 29, 30],
           [ 8, 11,  9, 10]])
    

    先にarrから[1,5,7,2]の4行を選択するという意味です.
    array([[ 4,  5,  6,  7],
           [20, 21, 22, 23],
           [28, 29, 30, 31],
           [ 8,  9, 10, 11]])
    

    そして[:,[0,3,1,2]]はすべての行が選択されていることを示しますが、列の順序は0,3,1,2で並べます.すると、次のようになります.
    array([[ 4,  7,  5,  6],
           [20, 23, 21, 22],
           [28, 31, 29, 30],
           [ 8, 11,  9, 10]])
    

    配列の回転と軸の交換
    回転も、新しい配列ではなくviewを返します.2つの方法があります.1つはtransposeメソッドで、1つはTプロパティです.
    arr = np.arange(15).reshape((3, 5))
    arr
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    
    arr.T
    array([[ 0,  5, 10],
           [ 1,  6, 11],
           [ 2,  7, 12],
           [ 3,  8, 13],
           [ 4,  9, 14]])
    
    arr = np.arange(8).reshape((4, 2))
    print('   ',arr.T)
    print('   ',arr)
        [[0 2 4 6]
     [1 3 5 7]]
        [[0 1]
     [2 3]
     [4 5]
     [6 7]]
    
    np.dot(arr.T, arr)
    array([[56, 68],
           [68, 84]])
    

    上記の例は(2 x 4)x(4 x 2)=(2 x 2)である.得られた結果は2 x 2次元であり,通常の行列乗算である.
    多次元配列の場合、transposeは軸の数からなるtupleを受け入れ、軸を交換します.
    arr = np.arange(16).reshape((2, 2, 4))
    arr
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    arr.transpose((1, 0, 2))
    array([[[ 0,  1,  2,  3],
            [ 8,  9, 10, 11]],
    
           [[ 4,  5,  6,  7],
            [12, 13, 14, 15]]])
    

    ここで、secode axis(1)は1番目、first axis(0)は2番目に設定され、最後のaxisはエッジがない..Tを使用してswapping axes(交換軸)を回転させる特殊なケース.ndarrayにはswapaxesという方法があります.この方法は2つのaxis値を取り、この2つの軸を交換します.
    arr
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    #    second axis last axis
    # swapaxes    view,     data。
    arr.swapaxes(1, 2) 
    array([[[ 0,  4],
            [ 1,  5],
            [ 2,  6],
            [ 3,  7]],
    
           [[ 8, 12],
            [ 9, 13],
            [10, 14],
            [11, 15]]])
    

    汎用関数
    1、一元通用関数
    arr = np.arange(10)
    arr
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    #    
    np.sqrt(arr)
    array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
           2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])
    
    #   
    np.exp(arr)
    array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
           5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
           2.98095799e+03, 8.10308393e+03])
    

    2、二元汎用関数
    x = np.random.randn(8)
    y = np.random.randn(8)
    print('x=',x)
    print('y=',y)
    x= [ 1.62629116  0.50042105  0.88487288 -0.51454008 -0.89496779 -0.08716105
     -0.89026276 -0.15930902]
    y= [ 1.20995668  1.57812313  0.75357992  0.27981496 -1.21836378 -2.21635872
      0.46375206  0.12810278]
    
    #     
    np.maximum(x, y)
    array([ 1.62629116,  1.57812313,  0.88487288,  0.27981496, -0.89496779,
           -0.08716105,  0.46375206,  0.12810278])
    

    一般的ではありませんが、ufuncは複数の配列を返すこともできます.たとえばmodfは、ベクトル版divmod(python組み込み関数)で、modfは小数部と整数部を返します.
    この関数は、aをbで割った後、商と残数を返すメタグループを実現する.両方のパラメータa,bが整数である場合、整数除算が用いられ、結果は(a//b,a%b)に相当する.aまたはbが浮動小数点数である場合、(math.floor(a/b)、a%bに相当する.
    arr = np.random.randn(7) * 5
    arr
    array([ 0.23231361,  1.94750024, -5.65093763, -7.51480076, -0.34334917,
            6.57644177,  1.85733655])
    
    remainder, whole_part = np.modf(arr)
    #       
    remainder
    array([ 0.23231361,  0.94750024, -0.65093763, -0.51480076, -0.34334917,
            0.57644177,  0.85733655])
    
    #       
    whole_part
    array([ 0.,  1., -5., -7., -0.,  6.,  1.])
    

    擬似乱数
    疑似乱数と呼ぶのは、乱数生成アルゴリズムがseedに基づいて生成されるためである.すなわち、seed設定が同じであれば、毎回生成される乱数は同じである.
    対照的に、python内に構築されたrandomモジュールは一度に1つのサンプルしか生成できません.大量のサンプルを生成する方法ではnumpy.randomは非常に速いです.
    np.random.seed(2018)
    samples = np.random.normal(size=(4, 4))
    samples
    array([[-0.2767676 ,  0.581851  ,  2.14839926, -1.279487  ],
           [ 0.50227689,  0.8560293 , -0.14279008,  0.11007867],
           [-0.68806479,  0.43356408,  0.510221  , -0.16513097],
           [-1.35177905,  0.54663075,  1.23065512,  1.0764461 ]])
    

    seedはグローバルです.グローバル状態を回避するにはnumpy.random.RandomStateを使用して独立したジェネレータを作成します.
    rng = np.random.RandomState(2017)
    samples = np.random.normal(size=(4, 4))
    samples
    array([[-1.21062488, -0.30667657, -1.05741884,  0.40205692],
           [ 0.28916512,  1.28273322, -1.0656958 , -1.70663287],
           [-0.17279739,  0.06371017,  0.37062839, -1.60454294],
           [-2.16572937,  0.38037013, -0.27650109, -0.57568194]])
    

    次はnumpy.randomに書かれた関数です.
    アレイガイドプログラミング
    # [X,Y] = meshgrid(x,y)    x y          X Y
    #     X       x     ,   Y       y     
    m, n = (5, 3)
    x = np.linspace(0, 1, m)  #  linspace()       (linear space)
    y = np.linspace(0, 1, n)
    X, Y = np.meshgrid(x, y)
    print('x=',x)
    print('y=',y)
    print()
    print('X=',X)
    print('Y=',Y)
    x= [0.   0.25 0.5  0.75 1.  ]
    y= [0.  0.5 1. ]
    
    X= [[0.   0.25 0.5  0.75 1.  ]
     [0.   0.25 0.5  0.75 1.  ]
     [0.   0.25 0.5  0.75 1.  ]]
    Y= [[0.  0.  0.  0.  0. ]
     [0.5 0.5 0.5 0.5 0.5]
     [1.  1.  1.  1.  1. ]]
    

    ろんりじょうけん
    np.where(a,b,c)np.whereの2番目と3番目のパラメータは、配列である必要はありません.aは真の戻りb-aは偽の戻りcです.
    xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
    yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
    cond = np.array([True, False, True, True, False])
    
    result = np.where(cond, xarr, yarr)
    result
    array([1.1, 2.2, 1.3, 1.4, 2.5])
    
    #         2,       -2
    arr = np.random.randn(4, 4)
    print('arr= ', arr)
    
    np.where(arr > 0, 2, -2)
    arr=  [[-1.69790361  1.14692981  2.01866833  1.19685501]
     [-1.29768641  0.96410493  0.51591302 -0.04725618]
     [ 0.97338591 -0.88312949  0.53144571  1.0647404 ]
     [-0.60385003 -1.21294763  0.70985062  0.23991391]]
    
    
    
    
    
    array([[-2,  2,  2,  2],
           [-2,  2,  2, -2],
           [ 2, -2,  2,  2],
           [-2, -2,  2,  2]])
    
    #       2,         
    np.where(arr > 0, 2, arr)
    array([[-1.69790361,  2.        ,  2.        ,  2.        ],
           [-1.29768641,  2.        ,  2.        , -0.04725618],
           [ 2.        , -0.88312949,  2.        ,  2.        ],
           [-0.60385003, -1.21294763,  2.        ,  2.        ]])
    

    数学と統計の方法
    arr = np.random.randn(5, 4)
    arr
    array([[ 0.42185431,  0.7047803 ,  0.04540116,  0.53069007],
           [ 0.13812536,  0.37046313, -0.0538778 ,  1.072796  ],
           [ 0.41525259, -0.79155701, -0.80337487,  0.00400008],
           [ 0.8381884 ,  0.04708372, -2.22118689,  0.44879045],
           [-0.01343378,  0.78704248,  0.18833414, -1.58023087]])
    
    print('   :', arr.mean())
    print('   :', np.mean(arr)) #   
    print('   :', np.median(arr))
    
    print('  :', arr.sum())
    print('  :',arr.var())
    print('   ', arr.std())
    
    print('   :',arr.min())
    print('   :',arr.max())
    print('            :', np.ptp(arr))
    print()
    print('           :',arr.argmin())
    print('           :',arr.argmax())
    
    print('

    '
    , np.abs(arr)) print() print(' :
    '
    , np.diff(arr))
       : 0.02745704812129939
       : 0.02745704812129939
       : 0.16322975085704675
      : 0.5491409624259878
      : 0.6344954097327102
        0.7965522015114328
       : -2.2211868856516417
       : 1.0727959997704182
                : 3.29398288542206
    
               : 14
               : 7
    
       :
     [[0.42185431 0.7047803  0.04540116 0.53069007]
     [0.13812536 0.37046313 0.0538778  1.072796  ]
     [0.41525259 0.79155701 0.80337487 0.00400008]
     [0.8381884  0.04708372 2.22118689 0.44879045]
     [0.01343378 0.78704248 0.18833414 1.58023087]]
    
                       :
     [[ 0.28292599 -0.65937913  0.48528891]
     [ 0.23233777 -0.42434094  1.1266738 ]
     [-1.2068096  -0.01181786  0.80737495]
     [-0.79110468 -2.26827061  2.66997733]
     [ 0.80047625 -0.59870834 -1.76856501]]
    
    # axis           
    print('  :',arr.mean(axis=1))  #   
    print('  :',arr.mean(1))
    print()
    print('  :',arr.mean(axis=0))  #   
    print('  :',arr.mean(0))
    print()
    print('  :',arr.sum(axis=1))  #   
    print('  :',arr.sum(0))  #   
      : [-1.47618477 -0.40924536  0.27245489  0.22881218  1.1980545 ]
      : [-1.47618477 -0.40924536  0.27245489  0.22881218  1.1980545 ]
    
      : [-0.22275301  0.02190233 -0.6217432   0.67370703]
      : [-0.22275301  0.02190233 -0.6217432   0.67370703]
    
      : [-5.90473907 -1.63698144  1.08981957  0.91524871  4.79221799]
      : [-1.11376504  0.10951164 -3.10871598  3.36853515]
    
    #      
    arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])
    arr.cumsum()
    array([ 0,  1,  3,  6, 10, 15, 21, 28], dtype=int32)
    
    arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    arr
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    #     
    arr.cumsum(axis=0) #   
    array([[ 0,  1,  2],
           [ 3,  5,  7],
           [ 9, 12, 15]], dtype=int32)
    
    #     
    arr.cumprod(axis=1) #   
    array([[  0,   0,   0],
           [  3,  12,  60],
           [  6,  42, 336]], dtype=int32)
    

    ブール配列の方法
    #      0   
    arr = np.random.randn(100)   #            
    (arr > 0).sum()
    56
    
  • any検出配列のうち1つのtureが戻る限りtrue
  • である.
  • all検出配列のいずれもtrueであるからtrue
  • に戻る.
    bools = np.array([False, False, True, False])
    print('any  :', bools.any())
    print('all  :', bools.all())
    any  : True
    all  : False
    

    ツールバーの
  • 配列のarr.sort()メソッドを直接呼び出すと、既存の配列の順序が変更されます.
  • np.sort(arr)関数を使用すると、新しいソート後の結果が生成されます.
  • arr = np.random.randn(10)
    print('   :
    '
    , arr) arr.sort() print(' :
    '
    , arr)
       :
     [ 1.59249466  0.6515314  -0.22653    -2.09396182  1.98428654 -0.41047994
      0.4461693   0.53309987  0.50317313  0.45538713]
       :
     [-2.09396182 -0.41047994 -0.22653     0.4461693   0.45538713  0.50317313
      0.53309987  0.6515314   1.59249466  1.98428654]
    

    多次元配列の場合はaxisでソートすることもできます.
    arr = np.random.randn(5, 3)  # 5 3 
    arr
    array([[ 0.64807367,  0.64734467, -0.57956506],
           [ 1.30009271, -1.0096845 , -0.90608046],
           [ 0.96544172, -0.82934629, -0.1372017 ],
           [ 1.2585547 ,  0.90157093,  1.55362495],
           [-1.22715482, -1.68016336, -1.31421393]])
    
    # arr.sort(1) #   
    # arr.sort(0) #   
    arr.sort(axis=1)  #   
    arr
    array([[-0.57956506,  0.64734467,  0.64807367],
           [-1.0096845 , -0.90608046,  1.30009271],
           [-0.82934629, -0.1372017 ,  0.96544172],
           [ 0.90157093,  1.2585547 ,  1.55362495],
           [-1.68016336, -1.31421393, -1.22715482]])
    
    #                    ,          :
    large_arr = np.random.randn(1000)
    large_arr.sort()
    large_arr[int(0.05 * len(large_arr))] # 5% quantile
    -1.5947780268732517
    

    Numpyには、1次元配列に使用される基本的な集合操作もあります.np.uniqueは、順序が整い、重複しない値を返すことができます.
    names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
    np.unique(names)
    array(['Bob', 'Joe', 'Will'], dtype='
    ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
    np.unique(ints)
    array([1, 2, 3, 4])
    

    せんけいだいすう
    マトリックス乗算
    #     
    x = np.array([[1., 2., 3.], [4., 5., 6.]])
    y = np.array([[6., 23.], [-1, 7], [8, 9]])
    print('x:
    '
    ,x) print('y:
    '
    ,y) # x.dot(y) np.dot(x, y) x.dot(y)
    x:
     [[1. 2. 3.]
     [4. 5. 6.]]
    y:
     [[ 6. 23.]
     [-1.  7.]
     [ 8.  9.]]
    
    
    
    
    
    array([[ 28.,  64.],
           [ 67., 181.]])
    

    2 D配列と1 D配列の行列乗算により、1 D配列が得られます.
    np.dot(x, np.ones(3))  
    #         boradcasting,x      [1, 1, 1]        
    array([ 6., 15.])
    
    # @         ,        :
    x @ np.ones(3)
    array([ 6., 15.])
    

    マトリックスぶんかいnp.linalgは、マトリクスの分解や、転置やランク付けなどに使用できます.
    from numpy.linalg import inv, qr
    
    # X = np.round(np.random.randn(5, 5), 3) #      np.round         ,        
    X = np.random.randn(5, 5)
    X
    array([[-0.24821301, -0.73158913,  1.89565751, -1.23795063, -0.63359619],
           [ 0.29635489,  0.50478366, -0.31098479, -1.34502933,  0.17482175],
           [ 2.02590827, -1.15869345, -0.8894822 ,  0.266318  ,  1.07333646],
           [-1.31303883, -1.40763291, -0.4048509 , -1.92894314, -0.86348757],
           [ 0.2866783 ,  0.73102305,  0.11381171, -1.74766983,  0.77151067]])
    
    # X.T.dot(X)    X X        。
    mat = X.T.dot(X)
    np.round(mat, 2)
    array([[ 6.06,  0.04, -1.8 ,  2.48,  3.74],
           [ 0.04,  4.65,  0.14,  1.36,  1.09],
           [-1.8 ,  0.14,  4.66, -1.58, -1.77],
           [ 2.48,  1.36, -1.58, 10.19,  1.15],
           [ 3.74,  1.09, -1.77,  1.15,  2.92]])
    
    np.round(inv(mat), 2)
    array([[ 2.22,  0.9 , -0.58, -0.37, -3.38],
           [ 0.9 ,  0.62, -0.3 , -0.18, -1.48],
           [-0.58, -0.3 ,  0.45,  0.13,  1.07],
           [-0.37, -0.18,  0.13,  0.17,  0.55],
           [-3.38, -1.48,  1.07,  0.55,  5.65]])
    
    np.round(mat.dot(inv(mat)), 2)
    array([[ 1.,  0.,  0.,  0., -0.],
           [-0.,  1.,  0.,  0.,  0.],
           [ 0., -0.,  1.,  0.,  0.],
           [-0., -0.,  0.,  1., -0.],
           [ 0.,  0., -0., -0.,  1.]])
    
    q, r = qr(mat)
    np.round(r, 2)
    array([[-7.75, -0.98,  3.85, -6.13, -5.12],
           [ 0.  , -4.87, -0.19, -3.13, -0.96],
           [ 0.  ,  0.  , -3.97,  1.72,  0.59],
           [ 0.  ,  0.  ,  0.  , -8.08,  0.83],
           [ 0.  ,  0.  ,  0.  ,  0.  ,  0.15]])
    

    一般的なnumpy.linalg関数: