Pythonのarrayを基礎から応用まで詳しく解説!初心者向け完全ガイド

この記事のポイント

この記事では、Pythonのarrayについて基本から応用まで詳しく解説します。プログラミング初心者の方でも理解できるよう、具体的なコード例を交えながら説明していきます。

  • arrayの基本的な考え方と配列の仕組みを理解できる
  • 配列の基本操作である要素の追加・削除・ソート・検索の方法を習得できる
  • リストやnumpy配列との違いを知り、状況に応じた使い分けができる

目次

Pythonのarrayとは?

arrayは、同じ型のデータを順番に並べて格納するためのデータ構造です。例えば10個の数字や文字を、一つのまとまりとして管理できます。arrayモジュールを使うと、メモリを節約した効率の良い配列を作成できます。

初心者の方は、配列を「同じ種類の値を入れる箱がたくさん並んでいるもの」と考えてください。これにより、大量のデータを効率的に処理できるようになります。

import array # 整数を格納する配列を作成 numbers = array.array('i', [1, 2, 3, 4, 5]) print(numbers) print(f"配列の種類: {type(numbers)}")

出力結果

array('i', [1, 2, 3, 4, 5])
配列の種類: <class 'array.array'>

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

配列とは

配列とは、プログラミングにおいて複数の値を順番に整理して保存するための、基本的なデータ構造です。

身近な例で説明すると、番号が振られた学校のロッカーをイメージして下さい。それぞれのロッカー(要素)には0番から始まる番号(インデックス)が割り当てられており、この番号を使えば個々の値にアクセスできます。配列内の全ての要素は同じデータ型である必要があり、これによって効率的にメモリを使うことができます。

例えば、クラス全員のテストの点数を管理する場合、一つ一つ変数を作るのではなく、配列を使って一括管理することで、プログラムをシンプルにわかりやすく書くことができます。

import array # 文字を格納する配列(動物の名前の一部) animals = array.array('u', 'ネコイヌ') print(f"配列全体: {animals}") print(f"0番目の文字: {animals[0]}") print(f"1番目の文字: {animals[1]}") print(f"配列の長さ: {len(animals)}")

出力結果

配列全体: array('u', 'ネコイヌ')
0番目の文字: ネ
1番目の文字: コ
配列の長さ: 4

Pythonの配列の基本的なルール

Pythonの配列にはいくつかの重要なルールがあります。

まず、配列を作成する際には、必ずタイプコード(データの型を指定する文字)を指定する必要があります。よく使われるものは、'i'が整数、'f'が小数、'u'が文字です。

次に、一つの配列には同じデータ型の値しか入れられません。例えば、数字の配列に文字を混ぜることはできません。また、配列は作成後も要素を追加したり削除したりと自由に変更できます。インデックス番号は必ず0から始まり、マイナスの番号を使うと配列の後ろから数えることもできます。

これらのルールを理解することで、配列を安全かつ効率的に使えるようになります。

import array # 異なるタイプコードの配列例 integers = array.array('i', [10, 20, 30, 40]) # 整数配列 floats = array.array('f', [1.5, 2.7, 3.9]) # 小数配列 print(f"整数配列: {integers}") print(f"小数配列: {floats}") print(f"最初の要素: {integers[0]}") print(f"最後の要素: {integers[-1]}") print(f"後ろから2番目: {integers[-2]}")

出力結果

整数配列: array('i', [10, 20, 30, 40])
小数配列: array('f', [1.5, 2.700000047683716, 3.9000000953674316])
最初の要素: 10
最後の要素: 40
後ろから2番目: 30

array(配列)の使い方

arrayの基本的な使い方は、非常にシンプルです。まず、arrayモジュールをインポートし、適切なタイプコードを指定して配列を作成します。要素には、角括弧内にインデックス番号を指定してアクセスします。配列の要素数はlen関数で簡単に取得でき、for文を使えば全ての要素に順番にアクセスすることもできます。これらの基本操作を覚えることで、配列を幅広く活用できるようになります。

import array # テストの点数を格納する配列 test_scores = array.array('i', [85, 92, 78, 96, 88]) print(f"全ての点数: {test_scores}") # 各要素にアクセス print(f"1番目の点数: {test_scores[0]}点") print(f"配列の長さ: {len(test_scores)}個") # 全要素を順番に表示 for i, score in enumerate(test_scores): print(f"{i+1}回目のテスト: {score}点")

出力結果

全ての点数: array('i', [85, 92, 78, 96, 88])
1番目の点数: 85点
配列の長さ: 5個
1回目のテスト: 85点
2回目のテスト: 92点
3回目のテスト: 78点
4回目のテスト: 96点
5回目のテスト: 88点

配列の要素の追加と削除

配列の要素を追加する方法はいくつかあります。

appendメソッドを使うと配列の最後に新しい要素を追加し、insertメソッドを使うと好きな位置に要素を挿入できます。

削除についてもいくつか方法があり、removeメソッドは要素の値を指定して削除し、popメソッドはインデックスを指定して、削除するのと同時にその値を取得できます。さらに、del文を使ってインデックスを指定して削除することも可能です。

これらの操作により配列のサイズは自動的に調整され、メモリも無駄なく使われます。初心者の方は、最初にappendとpopを覚えるとよいでしょう。

import array # 動物の種類を数字で表現した配列 animal_types = array.array('i', [1, 2, 3]) # 1:ネコ, 2:イヌ, 3:ウマ print(f"最初の状態: {animal_types}") # 末尾に要素を追加(4:トリ) animal_types.append(4) print(f"トリを追加: {animal_types}") # 指定位置に要素を挿入(5:ウサギを2番目に) animal_types.insert(1, 5) print(f"ウサギを挿入: {animal_types}") # 最後の要素を削除して取得 removed_animal = animal_types.pop() print(f"削除された動物: {removed_animal}") print(f"削除後の配列: {animal_types}")

出力結果

最初の状態: array('i', [1, 2, 3])
トリを追加: array('i', [1, 2, 3, 4])
ウサギを挿入: array('i', [1, 5, 2, 3, 4])
削除された動物: 4
削除後の配列: array('i', [1, 5, 2, 3])

配列のソート

配列のソートとは、要素を大きさの順番に並べ替えることです。sorted関数を使うと昇順(小さい順)に並べ替えた配列を作成できます。また、降順(大きい順)にしたい場合は、reverse=Trueというオプションを追加します。ソートは、データを分析したり、素早く検索したりするためにとても重要な操作です。

import array # バラバラの数値が入った配列 random_numbers = array.array('i', [64, 34, 25, 12, 22, 11, 90]) print(f"ソート前: {random_numbers}") # 昇順ソート(小さい順) sorted_numbers = array.array('i', sorted(random_numbers)) print(f"昇順ソート: {sorted_numbers}") # 降順ソート(大きい順) reversed_numbers = array.array('i', sorted(random_numbers,reverse=True)) print(f"降順ソート: {reversed_numbers}")

出力結果

ソート前: array('i', [64, 34, 25, 12, 22, 11, 90])
昇順ソート: array('i', [11, 12, 22, 25, 34, 64, 90])
降順ソート: array('i', [90, 64, 34, 25, 22, 12, 11])

配列の検索

配列内で特定の値を探す方法を説明します。indexメソッドを使用すると、指定した値が配列の中のどの場所(インデックス)に最初にあるかがわかります。値が配列内に存在するかどうかは、in演算子を使って確認できます。

さらに、countメソッドを使えば、特定の値が配列内にいくつあるかを数えられます。ただし、存在しない値をindexメソッドで検索するとエラーになってしまうため、事前にin演算子で存在を確認しておくことがおすすめです。

import array # 動物の種類を表す配列(重複あり) animals = array.array('i', [1, 2, 3, 2, 4]) # 1:ネコ, 2:イヌ, 3:ウマ, 4:トリ search_animal = 2 # イヌを検索 print(f"動物配列: {animals}") print(f"検索対象: {search_animal}(イヌ)") # 値の存在確認 if search_animal in animals: # 最初に見つかった位置を取得 first_index = animals.index(search_animal) + 1 # 出現回数を取得 count = animals.count(search_animal) print(f"イヌは{first_index}番目に最初に見つかりました") print(f"イヌの出現回数: {count}回") else: print("イヌは見つかりませんでした")

出力結果

動物配列: array('i', [1, 2, 3, 2, 4])
検索対象: 2(イヌ)
イヌは2番目に最初に見つかりました
イヌの出現回数: 2回

配列の変換

配列は他のデータ形式に変換することで、さまざまな用途で活用できます。tolistメソッドを使うと、配列をPythonの標準的なリストに変換できます。tobytesメソッドではバイト列に変換できるため、データの保存や送信に役立ちます。文字の配列は、tounicodeメソッドで文字列に変換することも可能です。逆に、リストから配列を作るにはfromlistメソッドを、バイト列から配列を復元するにはfrombytesメソッドが使えます。

import array # 数値配列を作成 original_array = array.array('i', [10, 20, 30, 40]) print(f"元の配列: {original_array}") # 配列をリストに変換 converted_list = original_array.tolist() print(f"リストに変換: {converted_list}") print(f"変換後の型: {type(converted_list)}") # バイト列に変換して、新しい配列として復元 byte_data = original_array.tobytes() print(f"バイトデータ長: {len(byte_data)}バイト") # バイト列から配列を復元 restored_array = array.array('i') restored_array.frombytes(byte_data) print(f"復元された配列: {restored_array}")

出力結果

元の配列: array('i', [10, 20, 30, 40])
リストに変換: [10, 20, 30, 40]
変換後の型: <class 'list'>
バイトデータ長: 16バイト
復元された配列: array('i', [10, 20, 30, 40])

多次元配列やリストとの違いと使い分け

arrayと他のデータ構造には、それぞれ異なる特徴と使い方があります。初心者の方は、どの場面でどのデータ構造を選ぶべきかを理解することが重要です。

標準のarrayは、同じデータ型しか入れられない代わりに、メモリ効率が良く、処理も速いです。一方、リストは異なるデータ型を混ぜて入れられる柔軟性がありますが、大量データを扱うのには向きません。numpy配列は科学計算や数値処理に特化しており、多次元のデータや豊富な数学関数を扱うのに非常に便利です。

扱うデータの性質、処理内容、どれくらいのパフォーマンスが必要かを考慮して、適切なデータ構造を選択することで、効率的で読みやすいプログラムを作れるようになります。

numpy.ndarray(多次元配列)

numpy.ndarrayは、科学計算やデータ分析に特化した、高性能な多次元配列です。Python標準のarrayと比較して、より多くの数学的な機能を持っており、行列やベクトルを使った計算を効率的に実行できます。また、2次元や3次元といった多次元データも簡単に扱えます。

ただし、numpyライブラリを別途インストールする必要があり、もしデータの保存だけが目的であれば、Python標準の配列で十分な場合もあります。データ分析や機械学習を行う場合には、numpyが必須のライブラリといえます。

import numpy as np # numpy配列での効率的な計算 np_array = np.array([1, 2, 3, 4, 5]) doubled = np_array * 2 # 全要素を一度に2倍 print(f"元の配列: {np_array}") print(f"2倍した結果: {doubled}") # 2次元配列の例 matrix = np.array([[1, 2], [3, 4]]) print(f"2次元配列:\n{matrix}") print(f"配列の形状: {matrix.shape}")

出力結果

元の配列: [1 2 3 4 5]
2倍した結果: [ 2  4  6  8 10]
2次元配列:
[[1 2]
 [3 4]]
配列の形状: (2, 2)

list(リスト)

Pythonのリストは、最も柔軟で使いやすいデータ構造です。一つのリストに文字列や数値、真偽値といった異なるデータ型の値を混ぜて格納できます。また、サイズを自由に変更できる上に豊富なメソッドが用意されているため、初心者にも扱いやすいのが特徴です。

しかし、大量の数値データを処理する場合は、arrayに比べてメモリ使用量が多く、処理速度も遅くなる傾向があります。小規模なデータや多様なデータ型を扱う場合には、リストが最適なデータ構造となります。

# リストの柔軟性を示す例 mixed_data = [1, 'ネコ', 3.14, True, [10, 20]] print(f"混合データリスト: {mixed_data}") print(f"各要素の型:") for i, item in enumerate(mixed_data): print(f" {i}: {item} ({type(item).__name__})") # リスト内包表記の例 animal_lengths = [len(animal) for animal in ['ネコ', 'イヌ', 'ウマ']] print(f"動物名の文字数: {animal_lengths}")

出力結果

混合データリスト: [1, 'ネコ', 3.14, True, [10, 20]]
各要素の型:
  0: 1 (int)
  1: ネコ (str)
  2: 3.14 (float)
  3: True (bool)
  4: [10, 20] (list)
動物名の文字数: [2, 2, 2]

arrayの実用例

ここからは、Pythonのarrayを使った実践的な活用方法を具体的なコード例とともに紹介します。実際の開発現場でよく使われるパターンを中心に、配列の基本操作から応用まで、順番に解説していきます。

各例では、実行可能なコードとそれによって得られる出力結果を示しており、初心者の方でも実際に試しながら理解を深めることができます。これらのサンプルコードを参考に、さまざまな場面でPythonのarrayを効果的に活用してください。温度データの管理から成績の集計まで、日々のプログラミングに役立つ身近な例をたくさん用意しました。

数値データの格納と操作

気温センサーから得た温度データを配列に入れ、統計的な分析を行う例です。このような数値データの処理は、IoTシステムやデータ分析でよく使われます。

import array # 1週間の気温データ(摂氏) temperatures = array.array('f', [23.5, 25.2, 24.8, 26.1, 24.3, 22.9, 25.7]) print(f"気温データ: {[f'{temp:.1f}' for temp in temperatures]}度") # 統計情報の計算 average = sum(temperatures) / len(temperatures) max_temp = max(temperatures) min_temp = min(temperatures) print(f"平均気温: {average:.1f}度") print(f"最高気温: {max_temp:.1f}度") print(f"最低気温: {min_temp:.1f}度")

出力結果

気温データ: ['23.5', '25.2', '24.8', '26.1', '24.3', '22.9', '25.7']度
平均気温: 24.6度
最高気温: 26.1度
最低気温: 22.9度

データの集計処理

学生のテストの点数を配列で管理し、条件に合わせてさまざまな集計を行う例です。これは、教育現場や成績管理システムなどで役立ちます。

import array # クラス全員のテスト点数 test_scores = array.array('i', [85, 92, 76, 98, 84, 91, 79, 88, 95, 82]) print(f"全員の点数: {list(test_scores)}") # 条件別の集計 excellent = [score for score in test_scores if score >= 90] # 90点以上 good = [score for score in test_scores if 80 <= score < 90] # 80-89点 needs_improvement = [score for score in test_scores if score < 80] # 80点未満 print(f"優秀(90点以上): {len(excellent)}人 - {excellent}") print(f"良好(80-89点): {len(good)}人 - {good}") print(f"要改善(80点未満): {len(needs_improvement)}人 - {needs_improvement}") print(f"クラス平均: {sum(test_scores) / len(test_scores):.1f}点")

出力結果

全員の点数: [85, 92, 76, 98, 84, 91, 79, 88, 95, 82]
優秀(90点以上): 4人 - [92, 98, 91, 95]
良好(80-89点): 4人 - [85, 84, 88, 82]
要改善(80点未満): 2人 - [76, 79]
クラス平均: 87.0点

配列の結合操作

複数の部門やグループのデータを統合する処理です。企業のデータ管理や、複数のセンサーからのデータを統合する際に活用できます。

import array # 異なる部門の売上データ sales_dept_a = array.array('i', [120, 150, 180]) # A部門の売上(万円) sales_dept_b = array.array('i', [200, 175]) # B部門の売上(万円) sales_dept_c = array.array('i', [90, 110, 140, 160]) # C部門の売上(万円) print(f"A部門: {list(sales_dept_a)}万円") print(f"B部門: {list(sales_dept_b)}万円") print(f"C部門: {list(sales_dept_c)}万円") # 全部門の売上を統合 total_sales = array.array('i', sales_dept_a) total_sales.extend(sales_dept_b) total_sales.extend(sales_dept_c) print(f"全社売上: {list(total_sales)}万円") print(f"総売上額: {sum(total_sales)}万円") print(f"平均売上: {sum(total_sales) / len(total_sales):.1f}万円")

出力結果

A部門: [120, 150, 180]万円
B部門: [200, 175]万円
C部門: [90, 110, 140, 160]万円
全社売上: [120, 150, 180, 200, 175, 90, 110, 140, 160]万円
総売上額: 1325万円
平均売上: 147.2万円

条件に基づく要素の抽出

大きなデータセットから、特定の条件を満たす要素のみを抽出する処理です。データの絞り込みやレポート作成に役立ちます。

import array # 商品の価格データ product_prices = array.array('i', [1200, 3500, 800, 4200, 1900, 600, 2800, 5000]) print(f"全商品価格: {list(product_prices)}円") # 価格帯別の商品抽出 budget_items = array.array('i', [price for price in product_prices if price <= 1000]) mid_range = array.array('i', [price for price in product_prices if 1000 < price <= 3000]) premium = array.array('i', [price for price in product_prices if price > 3000]) print(f"お買い得商品(1000円以下): {list(budget_items)}円") print(f"ミドルレンジ(1001-3000円): {list(mid_range)}円") print(f"プレミアム商品(3001円以上): {list(premium)}円") # 統計情報 print(f"お買い得商品数: {len(budget_items)}個") print(f"最高価格: {max(product_prices)}円") print(f"平均価格: {sum(product_prices) / len(product_prices):.0f}円")

出力結果

全商品価格: [1200, 3500, 800, 4200, 1900, 600, 2800, 5000]円
お買い得商品(1000円以下): [800, 600]円
ミドルレンジ(1001-3000円): [1200, 1900, 2800]円
プレミアム商品(3001円以上): [3500, 4200, 5000]円
お買い得商品数: 2個
最高価格: 5000円
平均価格: 2500円

配列のコピーと参照

配列のコピー操作について理解し、元のデータとは独立したデータを確保する方法を学びます。データを安全に複製することは、プログラムの信頼性を高める上で重要です。

import array import copy # 元となる動物IDの配列 original_animals = array.array('i', [1, 2, 3]) # 1:ネコ, 2:イヌ, 3:ウマ print(f"元の配列: {list(original_animals)}") # 異なるコピー方法の比較 reference = original_animals # 参照(同じオブジェクト) shallow_copy = original_animals[:] # 浅いコピー(スライス) deep_copy = copy.deepcopy(original_animals) # 深いコピー # 浅いコピーでは要素自体はもとのリストと参照先を共有する。つまり、コピーされた要素を変更すると元のリストも変更される。 # 一方、深いコピーでは完全に新しくコピーされるため、コピーされた要素を変更しても元のリストに影響はない # 元の配列を変更 original_animals[0] = 4 # ネコをトリに変更 original_animals.append(5) # ウサギを追加 print("元の配列変更後:") print(f"元の配列: {list(original_animals)}") print(f"参照: {list(reference)}") print(f"浅いコピー: {list(shallow_copy)}") print(f"深いコピー: {list(deep_copy)}")

出力結果

元の配列: [1, 2, 3]
元の配列変更後:
元の配列: [4, 2, 3, 5]
参照: [4, 2, 3, 5]
浅いコピー: [1, 2, 3]
深いコピー: [1, 2, 3]

よくある質問(Q&A)

Q: arrayとリストはどう使い分けるべきですか?

A: 同じ型のデータを大量に扱う場合はarray、異なる型のデータを混在させたい場合はリストを選択します。数値計算やファイル処理ではarrayが効率的です。

# 数値データのみ → array推奨 temperatures = array.array('f', [25.5, 30.2, 18.7]) # 混在データ → リスト推奨 mixed_data = ["ライオン", 5, 180.5, True]

Q: 型コードの種類と選び方は?

A: 'i'は整数、'f'は単精度浮動小数点、'd'は倍精度浮動小数点が主要です。データの精度要件とメモリ使用量を考慮して選択してください。

Q: arrayに文字列は格納できますか?

A: arrayは数値型専用で、文字列は直接格納できません。文字列データを扱いたい場合は、通常のリストを使用するか、文字コードに変換してarrayに格納する方法があります。

Q: arrayの要素を変更できますか?

A: はい、arrayの要素は変更可能です。インデックスを指定して新しい値を代入できます。ただし、指定した型に合致する値のみ格納できるため、型の整合性は保たれます。

animals = array.array('i', [3, 5, 8]) animals[0] = 10 # インコの数を変更 print(animals)

Q: arrayでエラーが発生する主な原因は?

A: 主な原因は型の不一致です。整数型arrayに浮動小数点数を代入したり、存在しないインデックスにアクセスするとエラーになります。事前の型チェックと範囲確認が重要です。

まとめ

Pythonのarrayについて、基本の考え方から実用的な活用方法まで幅広く解説してきました。配列は効率的なデータ管理に欠かせない重要な概念であり、プログラミングスキルを上げるための基礎となります。

ポイント

  • 同じデータ型を使うことで、メモリを効率的に使い、パフォーマンスの向上ができる
  • インデックスを使って、直感的にかつ高速に要素にアクセスできる
  • 追加・削除・ソート・検索などの豊富な操作メソッドが学べる
  • リストやnumpy配列との特徴を比べ、状況応じた適切な使い分けができる
  • 実際に使えるコード例を通して、具体的な活用パターンを習得できる

Pythonのarrayは、プログラミングにおいて数値データや同じ型のデータを大量に扱うのにとても便利なツールです。特に、メモリ効率が良く処理速度も速いため、IoTシステムでのセンサーデータ処理や金融システムでの数値計算、ゲーム開発でのスコア管理など、さまざまな分野で活用されています。

初心者の方は、まず基本的な配列の作り方と、要素にアクセスする方法をしっかり覚えましょう。その後、append・pop・sort・indexといった基本メソッドを使いこなせるようになれば、実際に役立つプログラムを作れます。さらに、扱うデータの種類に合わせてarray・list・numpy配列を使い分けることで、より効率的で読みやすいコードが書けるようになります。

継続的に学習と実践を重ねれば、配列の操作が自然にできるようになり、より複雑なデータ処理にも対応できるプログラミングスキルが身につきます。今回紹介した実用例を参考に、身近なデータを配列で管理するプログラムを実際に作成してみることをお勧めします。

プログラミングスキルをさらに向上させ、実践的な問題解決能力を身につけたい方には、段階的に学習できるpaizaラーニングでの学習がおすすめです。実際のコーディング問題を通じて、Pythonのarrayをはじめとするさまざまな技術を体系的に習得し、実務で活用できるレベルまでスキルアップすることができます。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. Pythonのナレッジ記事一覧
  4. Pythonのarrayを基礎から応用まで詳しく解説!初心者向け完全ガイド