Python
 Computer >> コンピューター >  >> プログラミング >> Python

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 charint
'B'unsigned charint
'u'Py_UNICODEUnicode文字
'h'signed shortint
'H'unsigned shortint
'i'signed intint
'I'unsigned intint
'l'signed longint
'L'unsigned longint
'q'signed long longint
'Q'unsigned long longint
'f'floatfloat
'd'doublefloat

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モジュールを活用すれば、大量の同種数値データをリストよりも少ないメモリで扱えます。特に数値計算やバイナリファイル処理において有効なので、用途に応じて使い分けてみてください。

  1. 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

  2. Pythonの数値型とは?int・float・complexの特徴と主な演算一覧

    Pythonの数値型の種類 Pythonには、用途に応じて複数の数値型が用意されています。主な組み込みの数値型は以下の3つです。 整数型:小数点を含まない数値(例:100) 浮動小数点数型:小数点を含む数値(例:3.256) 複素数型:実部と虚部を持つ数値で、(a + bj) の形式で表記します 複素数は、属性 .real で実部、.imag で虚部にアクセスすることができます。 また、標準ライブラリには、有理数を厳密に扱うための fractions.Fraction や、十進浮動小数点数を正確に計算できる decimal.Decimal なども用意されており、精度が求められる場面で活躍し