numpyメモ

numpyのメモ

【参考】
NumPy
【世界で5万人が受講】実践 Python データサイエンス | Udemy

 

numpyのimport

 

データの作成。これはnumpy関係ない。

 

numpyのアレイは全要素が同じデータ型でないといけない。
pythonのlistをnp.arrayに入れると行列の形で表示してくれる。
dtypeでデータ型を出力。これは確かにC言語っぽい。
【参考】NumPyにおける要素のデータ型dtypeの種類と指定方法 – DeepAge

 

行列の作成、計算

0行列、1行列、空行列、単位行列。

 

np.arangeで順列の行列を作成。要素ごとの四則演算、冪乗など。

 

arangeのアレンジ

 

スライスについて

基本的なものは以下のサイトがわかりやすい
[python] スライスでリバース!! – Qiita

上のサイトに載ってなかったものについて。
データを作る。ここまでは普通。

slice_arrの全要素に100を代入。

ここまではまぁわかります。しかしここでarr2の中身を見てみると、

なんと、元の配列にも100が代入されている。
これはslice_arrはarrのviewになるので
slice_arrの値の変更がarrにも反映されることになる。
【参考】NumPy配列のスライス表記の参照と代入 | hydroculのメモ

 

直感どおりに操作するためにはcopy()を使う。

もう一つ載っていなかったもの。多次元行列のスライス。

要素にアクセス
他の言語ではarr_2d[1][0]という感じでアクセスするが、numpyでは

としてもアクセスできる、また後者を使うべき理由としてスライスするときに直感的になる。
2次元行列の場合はArr[行,列]の形でスライスとアクセスができる。
また、i:j:nとすることで
「i以上でjより小さいインデックスをn個飛ばし」でスライスする。

例えば「1行以上、3行より小さい部分の行列を取り出す」

同様に、「0行以上、2行より小さい、かつ、1列以上、3列より小さい部分の行列を取り出す」

また始点終点が自明の場合は省略できるので以下のコードはarr_2d[0:2,1:3]と同じ部分をスライスする。

同様の考えで「2行目かつ全列をスライス」

0,2行目を取り出す

順番も変えられる。

ちょっとややこしいがこんなのもできる。
0*1と2*2の要素を取り出している。

スライスのスライスもできる。

 

【問】最後に復習がてら問題(答えは記事の最後)

とするとき、

の出力はどのようなものになるか。

 

転置行列

こんな行列があるとする。

以下3つは全て同じ。転置行列を返す。

transpose()やswapaxes()を使うことで行列の軸の入れ替えができる。

【参考】配列の軸の順番を入れ替えるNumPyのtranspose関数の使い方 – DeepAge

 

行列内の要素の計算

すべての要素を足し合わせる
arr.sum()

引数を与えることでどの軸に対して足し合わせるかを指定できる。

すべての要素の平均値
arr.mean()

標準偏差
arr.std()

分散
arr.var()

 

any()とall()

 

重複を取り除く np.unique()

 

2つのArrayから条件に合わせて新たなArrayを作る方法について

方法1 リスト内包表記を使う。
見た目は少しややこしいが、普通のfor文よりは高速。

出力はlist型。

リスト内包表記の参考
リスト内包表記 | Python Snippets
zip関数の参考
forループで便利な zip, enumerate関数 | Python Snippets
リスト内包表記内でのif文の参考
Python のリスト内包表記に、if ~ だけでなく、else ~ を付ける方法 – Qiita

 

方法2 np.whereを使う。

特徴は、上のリスト内包表記よりも高速。
多次元のArrayにも対応できる。
出力はnumpyのArray型であること。

 

行列の保存

どういう時に使うのかいまいちわからないがnumpyにはArrayなどを保存する機能もある。

zip形式でArrayを保存

テキスト形式で保存もできる

 

【答】途中の問題の回答。

コメントを残す