Pythonによるデータ分析ノート-Numpyベース
32158 ワード
チュートリアルに従ってしばらくの間データ分析を勉強して、学べば学ぶほど感じの穴が多くなります.そこで1週間かけて『Pythonによるデータ分析』をよく見ました.ここに書くのは主に記録して、自分で見るのが便利です.
n次元配列の作成
1、array関数の使用
最も簡単な方法はarray関数を使用して、リストなどのシーケンスを入力すればいいです.
各配列には、次元サイズを表すshapeがあります.dtypeはdata typeを表すために使用されます.
自発的に宣言しない限りnp.arrayはdataに適切なタイプを自動的に組み合わせてdtypeに保存します
データ型を指定することもできます
タイプをastypeで変換すると、astypeは常に新しい配列を返します. floatをintにすると、小数点以下の部分は 捨てられる.
2、その他の方法
npを除いてarray、配列を作成できる他の関数もあります.例えばzeros,ones、また1つのtupleでshapeを指定することもできます
はいれつけいさん
配列が重要なのは,forループを書かずに多くの操作を表現できるためであり,この特性をvectorization(ベクトル化)と呼ぶ.2つのサイズが等しい配列間の演算は、element-wise(点対点)です.
索引とスライス
1次元配列はlistと動作し、arrayのスライス後の結果はviews(ビュー)にすぎず、新しいarrayを作成するのではなく、既存のarrayに対応する要素を表すために使用されます.リストのスライスは新しいリストを生み出しました
ブール索引
花インデックス
配列が何次元であるかにかかわらず、フラワーインデックスの結果は常に1次元であり、fancy indexingはスライスとは異なり、新しいarrayが得られることを覚えておいてください.
先にarrから[1,5,7,2]の4行を選択するという意味です.
そして[:,[0,3,1,2]]はすべての行が選択されていることを示しますが、列の順序は0,3,1,2で並べます.すると、次のようになります.
配列の回転と軸の交換
回転も、新しい配列ではなくviewを返します.2つの方法があります.1つはtransposeメソッドで、1つはTプロパティです.
上記の例は(2 x 4)x(4 x 2)=(2 x 2)である.得られた結果は2 x 2次元であり,通常の行列乗算である.
多次元配列の場合、transposeは軸の数からなるtupleを受け入れ、軸を交換します.
ここで、secode axis(1)は1番目、first axis(0)は2番目に設定され、最後のaxisはエッジがない.
汎用関数
1、一元通用関数
2、二元汎用関数
一般的ではありませんが、ufuncは複数の配列を返すこともできます.たとえばmodfは、ベクトル版divmod(python組み込み関数)で、modfは小数部と整数部を返します.
この関数は、aをbで割った後、商と残数を返すメタグループを実現する.両方のパラメータa,bが整数である場合、整数除算が用いられ、結果は(a//b,a%b)に相当する.aまたはbが浮動小数点数である場合、(math.floor(a/b)、a%bに相当する.
擬似乱数
疑似乱数と呼ぶのは、乱数生成アルゴリズムがseedに基づいて生成されるためである.すなわち、seed設定が同じであれば、毎回生成される乱数は同じである.
対照的に、python内に構築されたrandomモジュールは一度に1つのサンプルしか生成できません.大量のサンプルを生成する方法ではnumpy.randomは非常に速いです.
seedはグローバルです.グローバル状態を回避するにはnumpy.random.RandomStateを使用して独立したジェネレータを作成します.
次はnumpy.randomに書かれた関数です.
アレイガイドプログラミング
ろんりじょうけん
np.where(a,b,c)
数学と統計の方法
ブール配列の方法 any検出配列のうち1つのtureが戻る限りtrue である. all検出配列のいずれもtrueであるからtrue に戻る.
ツールバーの配列のarr.sort()メソッドを直接呼び出すと、既存の配列の順序が変更されます. np.sort(arr)関数を使用すると、新しいソート後の結果が生成されます.
多次元配列の場合はaxisでソートすることもできます.
Numpyには、1次元配列に使用される基本的な集合操作もあります.
せんけいだいすう
マトリックス乗算
2 D配列と1 D配列の行列乗算により、1 D配列が得られます.
マトリックスぶんかい
一般的なnumpy.linalg関数:
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は常に新しい配列を返します.
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
bools = np.array([False, False, True, False])
print('any :', bools.any())
print('all :', bools.all())
any : True
all : False
ツールバーの
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関数: