
NumPy の配列
ここでは NumPy の最重要クラスである、numpy.ndarray
についてまとめます。
numpy.ndarray とは
NumPy では、型付きの多次元配列オブジェクトを扱うことができます。この型付き多次元配列のクラスが numpy.ndarray
です。ndarray は、n-dimmensional array の略で、日本語だとN次元配列の意味です。
この ndarray を使って、配列や行列のデータを扱うことができるようになります。
通常の Python では、配列のようなデータを扱う際には、list を使用しますが、list に比べて ndarray は以下のような特徴を持ちます。
- 配列の各要素の型はすべて同じ
- 配列長は固定(固定長配列)
- 配列の各次元のサイズ(要素数)は等しい
まず 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 クラスの属性で、配列の形状や型を参照できる。
以上。