ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

チュートリアル拾い読み (5):NumPy公式チュートリアル (5/5) [Python]

Rもたいして使いこなせてないのにPythonの勉強を始めてみました。色々と素晴らしいチュートリアルはありそうですが、目移りしてしまうので公式チュートリアルを拾い読みしていきます。

初回から続くNumPy公式チュートリアルの "NumPy: the absolute basics for beginners"も今回で最後の予定です。

前回:

necostat.hatenablog.jp

重複する要素

重複する要素を除外

NumPyライブラリのunique( )関数を使って、重複を除いた配列を返します。

a = np.array([[1,2,3,1],
              [4,3,2,4],
              [1,2,3,1]])
np.unique(a)  # 出力: [1 2 3 4]

次元ごとに固有のものを返したければ、axisで指定します。

np.unique(a, axis=0)

# 出力: 固有の行が返された
[[1 2 3 1]
 [4 3 2 4]]
np.unique(a, axis=1)

# 出力: 固有の列が返された
[[1 2 3]
 [4 3 2]
 [1 2 3]]

固有の要素の位置・個数

return_index = Trueとすれば、各固有の要素が最初に登場する位置(index)を返します。

a = np.array([1,1,1,2,2,3,3,3])
np.unique(a,return_index = True)
# 出力: 
(array([1, 2, 3]), array([0, 3, 5]))

return_counts = Trueで重複の個数をかえします。

a = np.array([1,1,1,2,2,3,3,3])
np.unique(a,return_counts = True)
# 出力: 
(array([1, 2, 3]), array([3, 2, 3]))

配列の転置

.transpose( )メソッドで次元の順序を入れ替えます。2次元配列(行列)なら縦横が入れ替わるだけなので分かりやすいです。

a = np.array([[1,2,3],
              [4,5,6]])
a.transpose()
# 出力: 
[[1 4]
 [2 5]
 [3 6]]

a.Tとしても同じものが得られます。

3次元以上の配列の場合も可能です。transpose( )に転置後の軸の順序を指定します。 例えば、新しい配列の軸を下のように

  • 新・軸0 ← 元・軸1
  • 新・軸1 ← 元・軸2
  • 新・軸2 ←元・軸0

.transpose(1,2,0)と指定します(つまり、カッコ内の数字は元の配列の軸番号)。

a = np.array([
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]],
    [[9, 10], [11, 12]]
])
a.transpose(1,2,0)
# 出力: 
array([[[ 1,  5,  9],
        [ 2,  6, 10]],

       [[ 3,  7, 11],
        [ 4,  8, 12]]])

入れ替わり方がややこしくてすぐに理解できないので図にしてみます。

くるくる回しただけでした。回転させて見る方向を変えただけですね。

以前確認した.reshape( )は、要素の並び方はそのままで区切り方を変える変形でしたが、.transpose( )は(1次元にほどいたときの)要素の並び方は変わっています。

配列の反転

要素の順序を逆にするには.flip( )メソッドを使います。

a = np.array([[1,2,3],
              [4,5,6]])
np.flip(a) 

# 出力:
array([[6, 5, 4],
       [3, 2, 1]])

配列を一旦1次元にほどいて、同じ形状で区切り直した配列が得られます。

axisを指定して、ある次元についてだけ反転させることもできます。

np.flip(a,axis=0)

# 出力: 軸0についての順番が逆になっている
[[4 5 6]
 [1 2 3]]

多次元配列の平坦化

多次元配列を1次元配列に解く(=平坦化)には、.flatten( ).ravel( )を使います*1

a = np.array([[1,2,3],
              [4,5,6]])
a.flatten()  #出力: [1 2 3 4 5 6]

flatten( ).ravel( )の違いは、

  • .flatten( )は深いコピー(完全な複製)を作成するのに対し、.ravel( )は浅いコピー(参照)を作成する。
  • .ravel( )はメソッドだけではなく関数もある(np.ravel(a)が可能)。

おわりに

今回学んだこと:

  • 固有の要素の抽出
  • reshapeは順序そのままで見た目が変わる
  • transposeは見た目そのままで順序が変わる

チュートリアルは読んだけど取り上げなかったもの:

  • help( ):ヘルプを表示する
  • pandas, matplotlibとの連携について書いてありましたが、それぞれのチュートリアルで勉強します。

次回:

  • Pandasシリーズに入ります。

necostat.hatenablog.jp

*1:ravel [英] = ほぐす・ほつれる [和]