NumPyの機能で最もよく利用するのが、今回紹介するndarrayだ。
ndarrayの名称は、N次元配列(N dimensional array)から由来されている。
今回はndarrayオブジェクトの生成方法を中心に紹介するが、ndarrayとはどういったオブジェクトなのかも簡単に紹介する。
まずはndarrayを利用した機能のうち、基礎的な算術演算の例から見ていこう。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | import numpy as np # 乱数を生成 data = np.random.randn( 2 , 3 ) print (data) print (data * 10 ) print (data + data) # 以下出力結果 [[ - 0.14803075 - 0.73867004 - 0.28079964 ] [ 0.21167575 0.39796281 - 0.84258059 ]] [[ - 1.48030746 - 7.38670036 - 2.80799635 ] [ 2.11675745 3.97962814 - 8.42580588 ]] [[ - 0.29606149 - 1.47734007 - 0.56159927 ] [ 0.42335149 0.79592563 - 1.68516118 ]] |
今回は、乱数からなるndarray配列を変数dataに格納し、全ての配列に10を掛けたり、配列同士を足し合わせたりという処理をおこなっている。
一例として、小さな多次元配列の算術演算を紹介したが、本来ndarrayでは大規模なデータ処理を高速かつ柔軟におこなうことができる。
コンテンツ
ndarrayオブジェクトの定義
ndarrayオブジェクトは、NumPyのarray関数を使用すると簡単に定義することができる。
引数にはリストやディクショナリなどのシーケンスを与えてやる。
1 2 3 4 5 6 | import numpy as np data = [ 1 , 1.1 , 2 , 3 ] arr = np.array(data) arr # array([1. , 1.1, 2. , 3. ]) |
多次元配列を定義する場合は以下のとおり。
1 2 3 4 5 6 | import numpy as np data = [[ 1 , 1.1 , 2 , 3 ], [ 'a' , 'b' , 'c' ]] arr = np.array(data) arr # array([list([1, 1.1, 2, 3]), list(['a', 'b', 'c'])], dtype=object) |
dtypeとshape属性
ndarrayは原則として、多次元配列の要素は全て同じデータ型である必要がある。
以下のような定義をしたところでエラーになるわけではないのだが、この後説明するdtypeで正確なデータ型を取得できなくなってしまうのだ。
1 2 3 4 | import numpy as np data = [[ 1 , 1.1 , 2 , 3 ], [ 'a' , 'b' , 'c' ]] arr = np.array(data) |
dtype
ndarrayにはdtypeという属性があり、配列の要素から推測されるデータ型を取得できる。
01 02 03 04 05 06 07 08 09 10 | import numpy as np data1 = [ 1 , 2 , 3 ] arr1 = np.array(data1) data2 = [ 1 , "a" , 1.1 ] arr2 = np.array(data2) arr1.dtype # dtype('int64') arr2.dtype # dtype('<U21') |
arr1は全ての要素がint型なので期待される値を得られたが、arr2ではデータ型がバラバラになっているため、正確なデータ型を得られることができなかった。
shape
shape属性はndarrayの次元数を取得することができる。
1 2 3 4 5 6 | import numpy as np data1 = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] arr1 = np.array(data1) arr1.shape # (2, 3) |
この場合、arr1は2行3列という次元を持つ配列であることが得られる。
ndarrayの様々な生成方法
先に紹介したNumPyのarray関数を使う方法が最もベーシックな生成方法だが、他にも様々な方法が用意されている。
全ての要素に0を設定
np.zerosを使えば、引数に指定したサイズのndarrayを生成し、同時に全ての要素に0を設定することができる。
1 2 3 4 5 | import numpy as np arr = np.zeros( 10 ) arr # array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) arr.dtype # dtype('float64') |
また、引数にタプルを指定して多次元配列を定義することも可能だ。
1 2 3 4 5 6 | import numpy as np arr = np.zeros(( 2 , 3 )) # array([[0., 0., 0.], # [0., 0., 0.]]) |
全ての要素に1を設定
np.onesを使えば全ての要素に1を設定したndarrayを生成できる。
1 2 3 4 | import numpy as np arr = np.ones( 10 ) arr # array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) |
連続した値を設定
np.arangeは、Python組み込みのrange関数と同等の機能を持ち、連続した値を設定することができる。
1 2 3 4 | import numpy as np arr = np.arange( 10 ) arr # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) |
全ての要素に指定した値を設定
np.fullは第一引数に配列のサイズ(shape)、第二引数に設定したい値を指定する。
1 2 3 4 5 6 7 | import numpy as np arr = np.full(( 2 , 3 ), "hoge" ) print (arr) # [['hoge' 'hoge' 'hoge'] # ['hoge' 'hoge' 'hoge']] |
まとめ
今回はndarrayの基礎編として、まずはオブジェクトを生成する方法を紹介しただけに留めた。
次回以降はデータ型の紹介やベクトル演算など、込み入った機能を紹介していこうと思う。