Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

【Python入門】arrayとは?arrayモジュールの基本的な使い方の解説

【Python入門】arrayとは?arrayモジュールの基本的な使い方の解説

今回はPythonのリストのうち、「数値だけ(整数や小数など)」を要素とするリストを作れる便利なarrayモジュールについて、その基本的な使い方の解説です。

なおarray(アレイ)とはプログラミング業界では「配列」を意味することが多いようですが、今回の記事ではPythonのarrayモジュールで作るarrayオブジェクトの意味で考えてください。

公式ページ

array — 効率のよい数値アレイ¶

通常のリストとarrayとの違い

まず通常のリストオブジェクトとの違いを見てみましょう。Pythonの通常のリストは、

def f():
    pass
  
num = 3.141592
normal_list: list = [1, "2", "三", "よん", num, f]

このnormal_listのように、リストの要素として様々な型のオブジェクトを入れることができます。これは便利で自由度が高いというメリットがありますが、コーディングのときのうっかりミスやそれによるエラーを引き起こす可能性が高くなるというデメリットもあります。

そこで、リストの要素として一定の決まった型のオブジェクトしか使えないという、要素の型が制限されたリストを作りたい場合が出てきます。特に「数値だけ」を要素とするリストはよく使われるため、数値だけを要素とするというルールのリストを作りたいものです。

そんな要望に応えるのがarrayモジュールです。ではそれの基本的な使い方を見ていきましょう。

arrayモジュールの基本的な使い方

基本的な使い方

基本的な使い方ですが、そもそもモジュールですのでインポートしてから、インスタンスを作成するという2つのステップを踏むことになります。次がその例です。

import array as arr

a: list = [8.0, 9.01, 10.543, 11, 12.23, 13.90, 14.00, 15.099999]

# 通常のリストとは違い、リスト内部の型を明確に指定・制限できる。それ以外は通常のリストと同じ
numbers: arr.array = arr.array('f', a)

この5行目ですが、

  • arr(arrayモジュール)のarray(class array.array)を使って、
  • arr.array(arrはarrayモジュールのこと)という型のオブジェクトを作成し、
  • それをnumbersという名前のオブジェクトに代入する

という処理です。

このarr.arrayの部分ですが、それを定義しているクラスは次のようになっています。

class array.array(①, ②(省略可))

この引数の①と②は、

  • ①:型コード
  • ②:イテラブルオブジェクト(上の例では、代表的なイテラブルオブジェクトとしてリストオブジェクトaを使っています)

がそれぞれ入ります。

①の型コードというのは上公式ページにあるこの表にあるものです。これから適切なコードを選びます。

型コードC の型Python の型最小サイズ (バイト単位)注釈
'b'signed charint1
'B'unsigned charint1
'u'wchar_tUnicode文字(unicode型)2(1)
'h'signed shortint2
'H'unsigned shortint2
'i'signed intint2
'I'unsigned intint2
'l'signed longint4
'L'unsigned longint4
'q'signed long longint8
'Q'unsigned long longint8
'f'浮動小数点数浮動小数点数4
'd'double浮動小数点数8

上のコード例では、「’f’」をしているので、浮動小数点数がリストの要素であるというルールが決められています。

さて上のコード例で作ったnumbersですが、それを表示させてみましょう。

print(numbers)

結果は、

array('f', [8.0, 9.010000228881836, 10.543000221252441, 11.0, 
12.229999542236328, 13.899999618530273, 14.0, 15.09999942779541])

となります。ただの小数から、浮動小数点という数へ変化しているのがわかると思います。

ではこのnumbersというarrayの要素数(長さ)はどうなっているでしょうか、

print(len(numbers))

実行結果は、

8

となり。8個の要素が数えられています。つまり、array(‘f’, リスト)の「’f’」という型コードの部分は含まれていないわけですね。実際、

print(numbers[0])

とすれば、

8.0

と表示されます。これは第2引数として指定したイテラブルオブジェクトであるリストの最初の要素です。

さてこのarrayモジュールには、いくつもの便利なメソッドが用意されいます。それを使ってみましょう。

reverse: 並びを逆順へ

numbers.reverse()
print(numbers)

結果は、

array('f', [15.09999942779541, 14.0, 13.899999618530273, 12.229999542236328, 11.0, 10.543000221252441, 9.010000228881836, 8.0])

上述のように型コードの部分は別として、イテラブルオブジェクトであるリストの部分が変化していますね。要素の並びが逆になっています。

index: 要素のインデックスを取得

では上で逆順に並び替えたnumbersから、特定の要素を指定してその要素のインデックス番号を取得してみましょう。indexメソッドを使います。

print(numbers.index(10.543000221252441))

結果は、

5

ここで注意したいのは、最初のリストオブジェクトaでは、「10.543」だった要素が、arrayオブジェクトにおいてはすでに「10.543000221252441」へと変わってしまっているという点です。よって、indexの引数には「10.543000221252441」を指定します。こうしないと要素が見つからずエラーとなります。

このindexは、スライス機能を使って、検索する範囲を指定できます。 同じく逆順に並び替えたnumbersを前提として、

print(numbers.index(11, 3, 8))

これは、逆順になったnumbersのインデックス番号3~同7(最後の8は含まれません)までという範囲を指定して、11という数字を探し、それが見つかればそのインデックス番号を返すという処理です。

結果は、

4

となります。

append: 新たな要素を末尾に追加

他にも通常のリストでもよく使うappendが、このarrayモジュールでも用意されています。

b: list = [1, 2, 3, 4, 13001111111, "Apple", 'hello \u2641', 10]  # 13001111111 is over 1 bite # 13001111111 is over 1 bite
arr_list: arr.array = arr.array('b', [])

for i in b:
    arr_list.append(i)
    
print(arr_list)

この処理の内容ですが、1行目では通常のリストを作成しています。

2行目では、空のリストを持つarray.array型のオブジェクトarr_listを作っています。そしてそのリストに入るオブジェクトの型コードとして「’b’」が指定され、これは、C言語の1バイトの長さまでの符号付きchar型(文字型)しか要素にできないという指定です。上の型コード表を見てください。

5つ目の要素「13001111111」はPythonでは普通のint型(整数型)ですが、これはその「’b’」という指定では対応できないデータのためOverflowErrorが出ます。そのためそこでfor文の処理が止まります。そのため実行結果は、

array('b', [1, 2, 3, 4])

となります。通常のリストのappendは通常のリスト型のオブジェクトを返しますが、このarrayモジュールでのappendは、あくまでarray.arrayという型のオブジェクトを返すものだという点に注意しましょう。

他にもいろいろなメソッドが用意されていますので、上の公式ページで見て試してみてください。

愛を分かち合いましょう