array – データ型固定のシーケンス¶
目的: | データ型を数値に固定したシーケンスを効率良く管理する |
---|---|
利用できるバージョン: | 1.4 以上 |
array モジュールは全ての要素が同じデータ型でなければいけないことを除けば :class:list そっくりのシーケンスデータ構造を定義します。サポートされているデータ型は全て数値か、バイト型のような古くからある固定長のデータ型になります。
コード | データ型 | 最小サイズ (バイト) |
---|---|---|
c | character | 1 |
b | int | 1 |
B | int | 1 |
u | Unicode character | 2 or 4 (build-dependent) |
h | int | 2 |
H | int | 2 |
i | int | 2 |
I | long | 2 |
l | int | 4 |
L | long | 4 |
f | float | 4 |
d | float | 8 |
アレイの初期化¶
array は許容されたデータ型を表す引数と、おそらくはアレイに格納する初期データシーケンスと一緒にインスタンス化されます。
import array
import binascii
s = 'This is the array.'
a = array.array('c', s)
print 'As string:', s
print 'As array :', a
print 'As hex :', binascii.hexlify(a)
この例のアレイはバイト列を持つように設定されて単純な文字列で初期化されます。
$ python array_string.py
As string: This is the array.
As array : array('c', 'This is the array.')
As hex : 54686973206973207468652061727261792e
アレイを巧みに扱う¶
array は伸長できて、さらに他の Python シーケンスと同様に巧みに扱えます。
import array
a = array.array('i', xrange(5))
print 'Initial :', a
a.extend(xrange(5))
print 'Extended:', a
print 'Slice :', a[3:6]
print 'Iterator:', list(enumerate(a))
$ python array_sequence.py
Initial : array('i', [0, 1, 2, 3, 4])
Extended: array('i', [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
Slice : array('i', [3, 4, 0])
Iterator: [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 0), (6, 1), (7, 2), (8, 3), (9, 4)]
アレイとファイル¶
アレイのコンテンツは効率的にコーディングされたビルトインメソッドを使用して、アレイへの書き込みとファイルからの読み込みを行うことができます。
import array
import binascii
import tempfile
a = array.array('i', xrange(5))
print 'A1:', a
# Write the array of numbers to the file
output = tempfile.NamedTemporaryFile()
a.tofile(output.file) # must pass an *actual* file
output.flush()
# Read the raw data
input = open(output.name, 'rb')
raw_data = input.read()
print 'Raw Contents:', binascii.hexlify(raw_data)
# Read the data into an array
input.seek(0)
a2 = array.array('i')
a2.fromfile(input, len(a))
print 'A2:', a2
このサンプルは、直接バイナリファイルから “raw” データを読み込むのと、新たなアレイに格納してバイト型から適切な型へ変換するのを対比して説明しています。
$ python array_file.py
A1: array('i', [0, 1, 2, 3, 4])
Raw Contents: 0000000001000000020000000300000004000000
A2: array('i', [0, 1, 2, 3, 4])
バイトオーダの代替¶
アレイ内のデータがネイティブのバイトオーダではない、又は違うバイトオーダを持つシステムで使用するファイルへ書き込まれる前にスワップ処理を行う必要がある場合、Python からその要素のスワップ処理を繰り返し適用せずにアレイ全体を簡単に変換できます。
import array
import binascii
def to_hex(a):
chars_per_item = a.itemsize * 2 # 2 hex digits
hex_version = binascii.hexlify(a)
num_chunks = len(hex_version) / chars_per_item
for i in xrange(num_chunks):
start = i*chars_per_item
end = start + chars_per_item
yield hex_version[start:end]
a1 = array.array('i', xrange(5))
a2 = array.array('i', xrange(5))
a2.byteswap()
fmt = '%10s %10s %10s %10s'
print fmt % ('A1 hex', 'A1', 'A2 hex', 'A2')
print fmt % (('-' * 10,) * 4)
for values in zip(to_hex(a1), a1, to_hex(a2), a2):
print fmt % values
$ python array_byteswap.py
A1 hex A1 A2 hex A2
---------- ---------- ---------- ----------
00000000 0 00000000 0
01000000 1 00000001 16777216
02000000 2 00000002 33554432
03000000 3 00000003 50331648
04000000 4 00000004 67108864
See also
- array
- 本モジュールの標準ライブラリドキュメント
- struct
- struct モジュール
- Numerical Python
- NumPy は巨大なデータセットを効率的に扱うための Python ライブラリ