Pythonのarrayモジュール徹底解説:数値データを効率的に扱う配列の基本と活用術
配列(Array)は、C/C++やJavaなどの言語で広く使われている基本的なデータ構造です。これらの言語では、配列は「同じデータ型の要素を複数まとめたもの」として定義されます。一方Pythonには、組み込みの配列型は存在しません。リスト(List)やタプル(Tuple)も要素のコレクションですが、異なる型の要素を混在させることができます。
そこで登場するのがPython標準ライブラリのarrayモジュールです。このモジュールはC言語風の配列をエミュレートし、同種のデータをコンパクトかつ効率的に格納できます。モジュールではarrayクラスが定義されており、以下のコンストラクタで配列オブジェクトを生成します。
array(typecode, initializer)
typecode引数で配列の型を決定し、initializer引数には一致する型の要素からなるシーケンスを指定します。
次の例では、整数型の配列オブジェクトを作成しています。
>>> import array
>>> arr = array.array('i', range(5))
>>> arr
array('i', [0, 1, 2, 3, 4])
>>> type(arr)
<class 'array.array'>
>>> array.typecodes
'bBuhHiIlLqQfd'
arrayモジュールにはtypecodes属性が定義されており、文字列として利用可能なすべての型コードを返します。各文字は、対応するC言語の型とPythonの型を示します。
| 型コード | C言語の型 | Pythonの型 |
|---|---|---|
| 'b' | signed char | int |
| 'B' | unsigned char | int |
| 'u' | Py_UNICODE | Unicode文字 |
| 'h' | signed short | int |
| 'H' | unsigned short | int |
| 'i' | signed int | int |
| 'I' | unsigned int | int |
| 'l' | signed long | int |
| 'L' | unsigned long | int |
| 'q' | signed long long | int |
| 'Q' | unsigned long long | int |
| 'f' | float | float |
| 'd' | double | float |
initializer引数には、バイトライクなオブジェクトを指定することもできます。次の例では、文字列のバイト表現から配列を生成しています。
>>> arr1 = array.array('b', b'Hello')
>>> arr1
array('b', [72, 101, 108, 108, 111])
続いて、arrayクラスが提供する主なメソッドを見ていきましょう。
buffer_info() ― バッファ情報の取得
このメソッドは、配列の内容を保持しているバッファの現在のメモリアドレスと、要素数で表される長さを含むタプル (address, length) を返します。
>>> arr = array.array('i', [0, 1, 2, 3, 4])
>>> arr.buffer_info()
(2201141755144, 5)
count() ― 要素の出現回数を数える
指定した要素が配列内に出現する回数を返します。
>>> arr = array.array('i', [0, 1, 2, 3, 4])
>>> arr.count(2)
1
extend() ― 配列の結合
イテラブル(反復可能オブジェクト)の要素を配列の末尾に追加します。追加元のイテラブルは、対象の配列と完全に同じ型コードを持つ必要があります。型コードが一致しない場合はTypeErrorが発生します。
>>> arr = array.array('i', [0, 1, 2, 3, 4])
>>> arr1 = array.array('i',[10,20,30])
>>> arr.extend(arr1)
>>> arr
array('i', [0, 1, 2, 3, 4, 10, 20, 30])
fromfile() ― ファイルからデータを読み込む
ファイルオブジェクトからn個の項目(マシン値として)を読み込み、配列に追加します。
次の例では、まずファイルをバイナリ書き込みモードで開きます。
>>> file = open('test.txt','wb')
>>> file.write(b'Hello Python')
12
>>> file.close()
続いて、このファイルのデータを配列オブジェクトに追加します。
>>> a = array.array('i')
>>> file = open('test.txt','rb')
>>> a.fromfile(file,file.tell())
>>> a
array('i', [1819043144, 2035294319, 1852794996])
append() ― 要素を末尾に追加
新しい要素を配列の末尾に追加します。
fromlist() ― リストから要素を追加
リストの要素を配列に追加します。for x in list: a.append(x) と同等の動作を行います。
>>> a = array.array('i')
>>> a.append(10)
>>> a
array('i', [10])
>>> num = [20,30,40,50]
>>> a.fromlist(num)
>>> a
array('i', [10, 20, 30, 40, 50])
insert() ― 指定位置への挿入
指定した位置の直前に新しい要素を挿入します。
>>> a = array.array('i', [10, 20, 30, 40, 50])
>>> a.insert(2,25)
>>> a
array('i', [10, 20, 25, 30, 40, 50])
pop() ― 要素を取り出して削除
指定したインデックスの要素を配列から削除し、その値を返します。
>>> a = array.array('i', [10, 20, 30, 40, 50])
>>> x = a.pop(2)
>>> x
30
>>> a
array('i', [10, 20, 40, 50])
remove() ― 指定要素の削除
指定した値と一致する最初の要素を配列から削除します。
>>> a = array.array('i', [10, 20, 30, 40, 50])
>>> a.remove(30)
>>> a
array('i', [10, 20, 40, 50])
tofile() ― ファイルへ書き出す
配列のすべての要素を、書き込み権限のあるファイルオブジェクトに書き出します。
>>> a = array.array('i', [10, 20, 30, 40, 50])
>>> file = open("test.txt","wb")
>>> a.tofile(file)
>>> file.close()
>>> file = open("test.txt","rb")
>>> file.read()
b'\n\x00\x00\x00\x14\x00\x00\x00\x1e\x00\x00\x00(\x00\x00\x002\x00\x00\x00'
arrayモジュールを活用すれば、大量の同種数値データをリストよりも少ないメモリで扱えます。特に数値計算やバイナリファイル処理において有効なので、用途に応じて使い分けてみてください。
-
PythonでNumPy配列のデータ型を変更する方法(astypeの使い方)
NumPy配列のデータ型を変更するには、astype(data_type)メソッドを使用します。例えば、float64型のNumPy配列がある場合、astype()メソッドに変換したいデータ型を指定するだけで、int32型へと簡単に変更できます。また、NumPy配列の現在のデータ型は、dtype属性を使って確認できます。まずは、サンプルのNumPy配列のデータ型を確認してみましょう。サンプルコード:データ型の確認# NumPyライブラリをインポート import numpy as np # NumPy配列を作成 array = np.array([1, 2, 3, 4, 5]) # NumPy
-
Pythonの数値型とは?int・float・complexの特徴と主な演算一覧
Pythonの数値型の種類 Pythonには、用途に応じて複数の数値型が用意されています。主な組み込みの数値型は以下の3つです。 整数型:小数点を含まない数値(例:100) 浮動小数点数型:小数点を含む数値(例:3.256) 複素数型:実部と虚部を持つ数値で、(a + bj) の形式で表記します 複素数は、属性 .real で実部、.imag で虚部にアクセスすることができます。 また、標準ライブラリには、有理数を厳密に扱うための fractions.Fraction や、十進浮動小数点数を正確に計算できる decimal.Decimal なども用意されており、精度が求められる場面で活躍し