NumPyの配列(ndarray)

NumPy の配列

ここでは NumPy の最重要クラスである、numpy.ndarray についてまとめます。

numpy.ndarray とは

NumPy では、型付きの多次元配列オブジェクトを扱うことができます。この型付き多次元配列のクラスが numpy.ndarray です。ndarray は、n-dimmensional array の略で、日本語だとN次元配列の意味です。

この ndarray を使って、配列や行列のデータを扱うことができるようになります。

通常の Python では、配列のようなデータを扱う際には、list を使用しますが、list に比べて ndarray は以下のような特徴を持ちます。

  1. 配列の各要素の型はすべて同じ
  2. 配列長は固定(固定長配列)
  3. 配列の各次元のサイズ(要素数)は等しい

まず 1 についてですが、Pythonは動的型付け言語であり、list内の要素は異なる型が許容されます。一方の ndarray は、各要素の型はすべて同じでなければなりません。

次に 2 についてですが、Python の list は動的に要素を追加したり削除したりできますが、ndarray ではサイズ(要素数)を動的に増減させることはできません。

最後に 3 についてですが、ndarray の各次元におけるサイズ(要素数)は等しくなければなりません。例えば2次元配列の場合、1つ目の要素が長さ3で2つ目の要素が長さ2の配列みたいなパターンは許容されません。

以上のようにlistに比べるとかなり制限がりますが、内部の実体がC言語だからです。制限が大きいですが、listに比べて大規模なデータでも効率的に処理を行うことができるようになっています

numpy.ndarray の使い方

ndarray の生成

NumPyの配列、ndarray を生成のに最も一般的な方法は、Pythonのデータ(リストやタプル)から変換することです。

ndarray クラス(つまり配列)を、Pythonのデータ(リストやタプル)から変換して生成するには、numpy.array 関数を利用します。引数にPythonのデータを渡すことで値を初期化します。

# numpyパッケージを np という名前でインポート
import numpy as np

# numpy.array関数で3行x3列の行列を生成
a = np.array([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
])

print(a)
print("各要素の型:", a.dtype)
print("各配列の次元数:", a.shape)
print("次元数:", a.ndim)

# 出力結果
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# 各要素の型: int32
# 各配列の次元数: (3, 3)
# 次元数: 2

上のコードでは、numpy.array関数を使用して3行x3列の行列(つまり2次元配列)を生成しています。Print関数で表示すると、いい感じに表示されていることが確認できます。

各要素の型が int32 の整数値、3×3の2次元配列のデータであることを確認しています。

ndarray の形状や型を知る

データ分析や機械学習などの科学計算では、単純な配列だけではなく多次元の配列を扱います。今扱っているデータ(配列)の形状が知りたいことはよくあります。その場合に、各次元のサイズは shape、次元数は ndim という属性を参照することで確認できます。よく使うので覚えておきましょう。

dtype 属性で格納されているデータの型を参照できます。初期化時に指定することもできますが、何も指定しない場合は、numpy側で推定された型になります。上記例では整数値なので int32 と推定されています。

ndarray の生成時に型やサイズを指定する

numpy.array 関数で配列を生成する際に、データ型を指定することができます。後で見返して分かりづらくなったりするので、データ型の指定は必ず行うようにしたほうが良いです。

import numpy as np

# float型のデータとして配列を生成
a = np.array([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
], dtype="float")

print(a)
print(a.dtype)
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 9.]]
# float64

上記例では、型を指定してfloat型で配列のデータを生成しています。データを表示してみると小数点があり、設定されていることが確認できます。どのようなデータ型が指定できるのかは、次の表を確認してください。

dtype で指定できる型一覧

NumPyで使用できるデータ型は以下の表のとおりです。大きく分けて4つあります。

  • bool: 真偽値(8bitのサイズで格納される)
  • int: 符号付きの整数値
  • uint: 符号なしの整数値
  • float: 浮動小数点
  • complex: 複素数

5つのデータ型は、bool型を除いてデータのサイズを指定できます。

説明
bool ブール値(True or False)がバイト(8bit)として格納されます。
int デフォルトの整数型(C言語のlong型と同じ。int32 or int64)
int8 バイト(-128〜127)
int16 整数(-32768〜32767)
int32 整数(-2147483648〜2147483647)
int64 整数(-9223372036854775808〜9223372036854775807)
uint8 符号なし整数(0〜255)
uint16 符号なし整数(0〜65535)
uint32 符号なし整数(0〜4294967295)
uint64 符号なし整数(0〜18446744073709551615)
float float64の略
float16 半精度浮動小数点:符号ビット、5ビット指数、10ビット仮数
float32 単精度浮動小数点:符号ビット、8ビット指数、23ビット仮数
float64 倍精度浮動小数点:符号ビット、11ビット指数、52ビット仮数
complex complex128の略
complex64 2つの32ビット浮動小数点で表される複素数(実数成分と虚数成分)
complex128 2つの64ビット浮動小数点で表される複素数(実数および虚数成分)

ndarray クラスの属性一覧

上記公式リファレンスにある ndarray の属性を以下にまとめます。(ndarrayインスタンス).(属性) で ndarrayの情報を参照できます。

どんな情報を持っているか、ざっと目を通して確認しておきましょう。

属性 説明
T self.transpose()と同じですが、self.ndim < 2 の場合はselfが返されます。
data 配列のデータの先頭を指すPythonバッファオブジェクト。
dtype 配列の要素のデータ型。
flags 配列のメモリレイアウトに関する情報。
flat 配列上の1次元イテレータ。
imag 配列の虚数部分。
real 配列の実際の部分。
size 配列内の要素の数。
itemsize 1つの配列要素のバイト単位の長さ。
nbytes 配列の要素によって消費された合計バイト数。
ndim 配列の次元数。
shape 配列次元のタプル。
strides 配列をトラバースするときに各次元でステップするバイトのタプル。
ctypes 配列とctypesモジュールのやりとりを単純化するオブジェクト。
base メモリが他のオブジェクトからのものであれば基底オブジェクト。

まとめ

  • PythonのリストからNumPyの配列を生成するには、numpy.array 関数を利用する。
  • numpy.array 関数で配列を生成する際には、dtypeで型を指定する。
  • ndarray クラスの属性で、配列の形状や型を参照できる。

以上。

参考URL