似たような動作をするNumpyの関数たち【Python】

ワタシは本業でPythonを使用しております。主な用途は「可視化」です。Pandasで外部データ取込>クレンジング後、Seaborn(Matplotlibの拡張ライブラリ)で可視化といった具合です。その中でNumpyも使っているはずなのですが、簡単な配列しか使ってないので、そこまでNumpyを意識したことがなかったんですね。

しかし、教本:第4章の「Numpy」を写経していて、似た者同士の関数が結構あって奥が深いな~と思いました。この際しっかり学ぼうと思い、その子たちを並記し、理解を深めたいと思います。

この記事、ほぼワタシの備忘録になると思いますので、ご了承ください。

nojo

ちょっとの差がいちばん覚えらんないのよ。。。

Numpy似たもの関数にモヤッとされている方のお役に立てれば幸いです。

目次

深いコピーと浅いコピー

  • 深いコピー(Deep copy):コピー渡し>参照元の値は変わらない
  • 浅いコピー(Shallow copy):参照渡し>参照元の値が変わる

の違いは、参照(コピー元)の値を変えてしまう or 変わらない。

# 一次元配列の作成
moto = np.array([1,2,3])

# a1にmoto.flatten結果を格納
a1 = moto.flatten()

# a1[1]の値を変える
a1[1] = 5

# 結果確認
print("a1の値:",a1)
print("motoの値:",moto)
a1の値: [1 5 3]
motoの値: [1 2 3]

※参照元の値は変わらない

ゼロイチ行列と単位行列

  • ゼロイチ行列0や1で埋める行列を作成
  • 単位行列対角要素の行列を作成
# 2行3列のゼロ行列を作成
zero = np.zeros((2,3))

# 3行4列のイチ行列を作成
ichi = np.ones((3,4))

print("ゼロ行列",zero)
print("イチ行列",ichi)
 [0. 0. 0.]]
[[0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

指定値埋めと欠損値埋め

両者ともにまったく目的が違うけど、fullでnanを使うこともあるだろうから、明確化しておく。

# 円周率πで3行4列を埋める
pai = np.full((3,4),np.pi)

print(pai)
[[3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265]]

連結

concatenateとhstackは同じ動作をするが、違いはカラム数が異なる場合の対処。

# カラム数の異なる2次元配列を作成
aa = np.array([[7,7,7],[8,8,8]])
bb = np.array([[10],[20]])

# concatenateを使った連結
con = np.concatenate([aa,bb],axis=1)

print(con)
 [[ 7  7  7 10]
 [ 8  8  8 20]]

concatentate:カラム数が異なる場合は、axis=n増やすカラム数を指定しなければならない

分割

  • hsplit列方向に分割
  • vsplit行方向に分割
# hsplit:2つの2次元配列を作成
fst,scd = np.hsplit(vs,[2]) 

print(vs)
print(fst)
print(scd)
[[[ 7  7  7]
 [ 8  8  8]
 [49 64 81]]
[[ 7  7]
 [ 8  8]
 [49 64]]
[[ 7]
 [ 8]
 [81]]
hsplit(値変数,[2]):列方向の分割イメージ
hsplit(値変数,[2]):列方向の分割イメージ

次元変更

  • newaxis:増やしたい行 or 列方向にnewaxisを指定。要素数の指定は必要ない
  • reshape:要素数の指定が必要
# 一次元配列の作成
dd = np.array([1,2,3])
print(dd)

# 行方向スライジングにnewaxisを指定>次元をひとつ増やす
n_ax = dd[np.newaxis,:]

# 列方向スライジングにnewaxisを指定>行の追加
n_ax = dd[:,np.newaxis]

print(n_ax)
[1 2 3]
[[1]
 [2]
 [3]]

0~1範囲の乱数を生成

  • random.ramdom:0以上1未満の範囲で乱数を生成。サイズをタプルで指定
  • random.rand:0以上1未満の範囲で乱数を生成。サイズをshapeで指定
# random:
# 特徴:サイズをタプルを渡す>タプルは()で表すのが基本
m = np.random.random((3,2))

m
array([[0.24366405, 0.57585294],
       [0.29241931, 0.53651352],
       [0.0115334 , 0.39237284]])

tuple(タプル)イミュータブル(変更不可)なオブジェクトのこと。

n~m範囲の乱数を生成

  • random.randint:n以上m未満の範囲で乱数を生成。戻り値は整数値。サイズをタプルで指定
  • random.uniform:n以上m未満の範囲で乱数を生成。戻り値は少数値。サイズはsize=(タプル)で指定

※ n : 第一引数m:第二引数

#randint:戻り値→整数
# 第一引数以上かつ第二引数未満のランダムな数値で
# 第三引数のタプルで渡した行と列の二次元配列で生成
rd = np.random.randint(2,70,(4,4))

rd
array([[39, 20, 15, 27],
       [41,  5,  3, 39],
       [57,  7, 53, 27],
       [62, 25, 30, 19]])

※戻り値は整数

まだなんかあるかな。。。そのうち追加します。

最後まで読んで下さり、ありがとうございました

よかったらシェアしてね!
目次
TOP
目次
閉じる