5.13 array -- 効率のよい数値アレイ

このモジュールでは、基本的な値 (文字、整数、浮動小数点数) のアレイ (array、配列) を効率よく表現できるオブジェクト型を定義しています。 アレイはシーケンス (sequence) 型であり、中に入れる オブジェクトの型に制限があることを除けば、リストとまったく同じように振 る舞います。オブジェクト生成時に一文字の型コード を用いて型を指 定します。次の型コードが定義されています:

型コード C の型 Python の型 最小サイズ (バイト単位)
'c' char 文字(str型) 1
'b' signed char int型 1
'B' unsigned char int型 1
'u' Py_UNICODE Unicode文字(unicode型) 2
'h' signed short int型 2
'H' unsigned short int型 2
'i' signed int int型 2
'I' unsigned int long型 2
'l' signed long int型 4
'L' unsigned long long型 4
'f' float float型 4
'd' double float型 8

値の実際の表現はマシンアーキテクチャ (厳密に言うとCの実装) によって決 まります。値の実際のサイズはitemsize 属性から得られます。 Python の通常の整数型では C の unsigned (long) 整数の最大範囲を表せな いため、'L''I' で表現されている要素に入る値は Python では長整数として表されます。

このモジュールでは次の型を定義しています:

array( typecode[, initializer])
要素のデータ型がtypecodeに限定される新しいアレイを返します。 オプションの値initializerをわたすと初期値になりますが、 リスト、文字列または適当な型のイテレーション可能オブジェクトでなければ なりません。

バージョン 2.4 で 変更 された仕様: 以前はリストか文字列しか受け付けませんでした。 リストか文字列を渡した場合、新たに作成されたアレイのfromlist()fromstring()あるいはfromunicode()メソッド (以下を参照 して下さい) に渡され、初期値としてアレイに追加されます。それ以外の場合 には、イテレーション可能オブジェクト initializer は新たに作成 されたオブジェクトのextend()メソッドに渡されます。

ArrayType
arrayの別名です。撤廃されました。

アレイオブジェクトでは、インデクス指定、スライス、連結および反復といっ た、通常のシーケンスの演算をサポートしています。スライス代入を使うときは、 代入値は同じ型コードのアレイオブジェクトでなければなりません。 それ以外のオブジェクトを指定するとTypeError を送出します。 アレイオブジェクトはバッファインタフェースを実装しており、 バッファオブジェクトをサポートしている場所ならどこでも利用できます。

次のデータ要素やメソッドもサポートされています:

typecode
アレイを作るときに使う型コード文字です。

itemsize
アレイの要素 1 つの内部表現に使われるバイト長です。

append( x)
x の新たな要素をアレイの末尾に追加します。

buffer_info( )
アレイの内容を記憶するために使っているバッファの、現在のメモリアドレス と要素数の入ったタプル(address, length) を返します。 バイト単位で表したメモリバッファの大きさは array.buffer_info()[1] * array.itemsizeで計算できま す。例えばioctl() 操作のような、メモリアドレスを必要とする 低レベルな (そして、本質的に危険な) I/Oインタフェースを使って作業する 場合に、ときどき便利です。アレイ自体が存在し、長さを変えるような演算を 適用しない限り、有効な値を返します。

注意: C やC++ で書いたコードからアレイオブジェクトを使う場合 (buffer_info の情報を使う意味のある唯一の方法です) は、 アレイオブジェクトでサポートしているバッファインタフェースを使う方が より理にかなっています。このメソッドは後方互換性のために保守されており、 新しいコードでの使用は避けるべきです。バッファインタフェースの説明は Python/C APIリファレンスマニュアル にあります。

byteswap( )
アレイのすべての要素に対して「バイトスワップ」(リトルエンディアンとビッ グエンディアンの変換) を行います。このメソッドは大きさが 1、2、4 およ び 8 バイトの値にのみをサポートしています。他の型の値に使うと RuntimeError を送出します。異なるバイトオーダをもつ計算機 で書かれたファイルからデータを読み込むときに役に立ちます。

count( x)
シーケンス中のx の出現回数を返します。

extend( iterable)
iterable から要素を取り出し、アレイの末尾に要素を追加します。 iterable が別のアレイ型である場合、二つのアレイは全く同 じ型コードをでなければなりません。それ以外の場合には TypeError を送出します。 iterable がアレイでない場合、アレイに値を追加できるような正しい 型の要素からなるイテレーション可能オブジェクトでなければなりません。 バージョン 2.4 で 変更 された仕様: 以前は他のアレイ型しか引数に指定できませんでした。

fromfile( f, n)
ファイルオブジェクトf から (マシン依存のデータ形式そのままで) n 個の要素を読み出し、アレイの末尾に要素を追加します。 n 個の要素を読めなかったときはEOFError を送出します が、それまでに読み出せた値はアレイに追加されています。 f は本当の組み込みファイルオブジェクトでなければなりません。 read()メソッドをもつ他の型では動作しません。

fromlist( list)
リストから要素を追加します。型に関するエラーが発生した場合にアレイが変 更されないことを除き、"for x in list: a.append(x)"と同じです。

fromstring( s)
文字列から要素を追加します。文字列は、 (ファイルから fromfile() メソッドを使って値を読み込んだときのように) マシン依存のデータ形式で表された値の配列として解釈されます。

fromunicode( s)
指定した Unicode 文字列のデータを使ってアレイを拡張します。アレイの 型コードは 'u' でなければなりません。それ以外の場合には、 ValueError を送出します。他の型のアレイに Unicode 型のデータ を追加するには、"array.fromstring(ustr.decode(enc))" を使ってくだ さい。

index( x)
アレイ中でx が出現するインデクスのうち最小の値 i を返しま す。

insert( i, x)
アレイ中の位置i の前に値x をもつ新しい要素を挿入します。 i の値が負の場合、アレイの末尾からの相対位置として扱います。

pop( [i])
アレイからインデクスがi の要素を取り除いて返します。 オプションの引数はデフォルトで-1 になっていて、最後の要素を取り 除いて返すようになっています。

read( f, n)
リリース 1.5.1 で撤廃されました。 fromfile()メソッドを使ってください。

ファイルオブジェクトf から (マシン依存のデータ形式そのままで) n 個の要素を読み出し、アレイの末尾に要素を追加します。 n 個の要素を読めなかったときはEOFError を送出します が、それまでに読み出せた値はアレイに追加されています。 f は本当の組み込みファイルオブジェクトでなければなりません。 read()メソッドをもつ他の型では動作しません。

remove( x)
アレイ中のx のうち、最初に現れたものを取り除きます。

reverse( )
アレイの要素の順番を逆にします。

tofile( f)
アレイのすべての要素をファイルオブジェクトfに (マシン依存のデータ形式そのままで)書き込みます。

tolist( )
アレイを同じ要素を持つ普通のリストに変換します。

tostring( )
アレイをマシン依存のデータアレイに変換し、文字列表現 (tofile() メソッドによってファイルに書き込まれるものと同じ バイト列) を返します。

tounicode( )
アレイを Unicode 文字列に変換します。アレイの型コードは 'u' でなければ なりません。それ以外の場合には ValueError を送出します。 他の型のアレイから Unicode 文字列を得るには、 "array.tostring().decode(enc)" を使ってください。

write( f)
リリース 1.5.1 で撤廃されました。 tofile()メソッドを使ってください。

ファイルオブジェクトfに、全ての要素を(マシン依存のデータ形式その ままで)書き込みます。

アレイオブジェクトを表示したり文字列に変換したりすると、 array(typecode, initializer) という形式で表現されま す。アレイが空の場合、initializer の表示を省略します。アレイが 空でなければ、typecode'c' の場合には文字列に、 それ以外の場合には数値のリストになります。 関数array()from array import array で import して いる限り、変換後の文字列に逆クォーテーション(``)を用いると 元のアレイオブジェクトと同じデータ型と値を持つアレイに逆変換できること が保証されています。文字列表現の例を以下に示します:

array('l')
array('c', 'hello world')
array('u', u'hello \textbackslash u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14])

参考:

struct:モジュール
異なる種類のバイナリデータのパックおよびアンパック。.
xdrlib:モジュール
遠隔手続き呼び出しシステムで使われる外部データ表現仕様 (External Data Representation, XDR) のデータのパックおよびアンパック。.
The Numerical Python Manual
Numeric Python 拡張モジュール (NumPy) では、別の方法でシーケンス型を定義 しています。Numerical Python に関する詳しい情報は http://numpy.sourceforge.net/を参照してください。 (NumPy マニュアルの PDF バージョンは http://numpy.sourceforge.net/numdoc/numdoc.pdfで手に入ります。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。