# 5.11 `array` -- 効率のよい数値配列

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

型コード | 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をわたすと初期値になりますが、リストまたは文字列でなければなりません。新しい配列に初期要素を追加するために、リストまたは文字列はその配列の`fromlist()`、`fromstring()`あるいは`fromunicode()`メソッド(以下を参照して下さい)へ渡されます。

`ArrayType`
  もはや使われない`array`の別名。

配列オブジェクトは、添字付け、スライス、連結および反復といった通常のシーケンス演算をサポートします。スライス代入を使うとき、代入される値は同じ方コードの配列オブジェクトでなければなりません。他すべての場合には、`TypeError`が発生します。配列オブジェクトはバッファインターフェイスを実装しており、バッファオブジェクトがサポートされるところではどこでも使われます。

次のデータアイテムとメソッドもサポートされます:

`typecode`
  配列を作るときに使われる型コード文字です。

`itemsize`
  内部表現における1つの配列要素のバイト単位の長さです。

`append`( | x)

  値xをもつ新しい要素を配列の末尾に追加します。

`buffer_info`( | )

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

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

`byteswap`( | )

  配列のすべての要素に対して``バイトスワップ''(リトルエンディアンとビッグエンディアンの変換)を行います。これは大きさが1、2、4および8バイトである値に対してのみサポートされます。値の他の型に対しては、`RuntimeError`が発生します。異なるバイトオーダーをもつマシンで書かれたファイルからデータを読み込むときに役に立ちます。

`count`( | x)

  配列中のxの出現回数を返す。

`extend`( | a)

  aから配列の末尾へ配列要素を追加します。二つの配列は全く同じ型コードを持っていなければなりません。そうでなければ、`TypeError`が発生します。

`fromfile`( | f, n)

  ファイルオブジェクトfから(マシン依存のデータ形式そのままで)n個の要素を読み込み、それらを配列の末尾に追加します。n個の要素を読めなかったときは`EOFError`が発生しますが、そのときでも利用可能な要素は配列に追加されます。fは実際の組み込みファイルオブジェクトでなければなりません。`read()`メソッドをもつ他のものは動作しないでしょう。

`fromlist`( | list)

  リストから要素を追加します。型エラーが発生した場合に配列が変更されないことを除いて、"`for x in list: a.append(x)`"と同等です。

`fromstring`( | s)

  文字列から要素を追加します。(まるでファイルから`fromfile()`メソッドを使って読み込んだかのように)マシン依存のデータの配列として文字列を解釈しています。

`fromunicode`( | s)

  与えられたユニコード文字列からのデータで、この配列を拡張します。配列は型'u'の配列でなければなりません。そうでなければ、ValueErrorが発生します。他の型の配列にユニコードデータを追加するには、"`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`( | )

  配列をユニコード文字列に変換します。配列は型'u'の配列でなければなりません。そうでないならば、ValueErrorが発生します。他の型の配列からユニコード文字列を得るには、array.tostring().decode(enc)を使ってください。

`write`( | f)

  リリース 1.5.1 以降で撤廃された仕様です。 `tofile()`メソッドを使ってください。
  ファイルオブジェクトfに、全ての要素を(マシン依存のデータ形式そのままで)書き込みます。

配列オブジェクトが表示される、あるいは文字列に変換されるとき、`array(typecode, initializer)`というように表現されます。配列が空ならば、initializerは省略されます。そうではなくtypecodeが`'c'`ならば、それは文字列になります。さもなければ、数字のリストになります。`array()`関数が`from array import array`である限り、文字列は逆クォーテーション(````)を用いて同じデータ型と値を持つ配列に逆変換できることが保証されています。例:

    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で手に入ります。