NumPyの機能で最もよく利用するのが、今回紹介するndarrayだ。
ndarrayの名称は、N次元配列(N dimensional array)から由来されている。

今回はndarrayオブジェクトの生成方法を中心に紹介するが、ndarrayとはどういったオブジェクトなのかも簡単に紹介する。

まずはndarrayを利用した機能のうち、基礎的な算術演算の例から見ていこう。

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関数を使用すると簡単に定義することができる。

引数にはリストやディクショナリなどのシーケンスを与えてやる。

import numpy as np

data = [1, 1.1, 2, 3]
arr = np.array(data)

arr # array([1. , 1.1, 2. , 3. ])

多次元配列を定義する場合は以下のとおり。

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で正確なデータ型を取得できなくなってしまうのだ。

import numpy as np

data = [[1, 1.1, 2, 3], ['a', 'b', 'c']]
arr = np.array(data)

dtype

ndarrayにはdtypeという属性があり、配列の要素から推測されるデータ型を取得できる。

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の次元数を取得することができる。

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を設定することができる。

import numpy as np

arr = np.zeros(10)
arr # array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
arr.dtype # dtype('float64')

また、引数にタプルを指定して多次元配列を定義することも可能だ。

import numpy as np

arr = np.zeros((2, 3))

# array([[0., 0., 0.],
#        [0., 0., 0.]])

全ての要素に1を設定

np.onesを使えば全ての要素に1を設定したndarrayを生成できる。

import numpy as np

arr = np.ones(10)
arr # array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

連続した値を設定

np.arangeは、Python組み込みのrange関数と同等の機能を持ち、連続した値を設定することができる。

import numpy as np

arr = np.arange(10)
arr # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

全ての要素に指定した値を設定

np.fullは第一引数に配列のサイズ(shape)、第二引数に設定したい値を指定する。

import numpy as np

arr = np.full((2, 3), "hoge")
print(arr)

# [['hoge' 'hoge' 'hoge']
#  ['hoge' 'hoge' 'hoge']]

まとめ

今回はndarrayの基礎編として、まずはオブジェクトを生成する方法を紹介しただけに留めた。

次回以降はデータ型の紹介やベクトル演算など、込み入った機能を紹介していこうと思う。