Python の配列ガイド

Python の配列ガイド

概要

携帯電話にお気に入りの曲のプレイリストがあると想像してください。 このプレイリストは、各曲が特定の順序で配置されたリストです。 最初の曲を再生したり、XNUMX 番目の曲にスキップしたり、XNUMX 番目の曲にジャンプしたりすることができます。 このプレイリストは、コンピューター プログラミングの配列によく似ています。

配列は、最も基本的で広く使用されているデータ構造の XNUMX つです。

本質的に、配列は複数の項目 (数値、文字、その他の配列など) を特定の順序で格納するための構造化された方法であり、その位置 (インデックス) がわかっていれば、どの項目にもすばやくアクセス、変更、削除できます。

このガイドでは、配列データ構造の包括的な概要を説明します。 まず最初に、配列とは何なのか、そしてその主な特徴は何なのかを見ていきます。 次に、Python の世界に移り、実際のシナリオで配列がどのように実装、操作、および適用されるかを調べます。

配列のデータ構造を理解する

配列は、コンピューター サイエンスとプログラミングで使用される最も古く、最も基本的なデータ構造の XNUMX つです。 そのシンプルさと特定の操作の効率性により、データ管理と操作の分野を深く掘り下げる人にとって重要なトピックとなっています。

配列は項目のコレクションであり、通常は 同型に保存されています 連続したメモリ位置.

この連続ストレージにより、配列は、インデックスが指定されている任意の要素への定時アクセスを提供できます。 配列内の各項目は と呼ばれます。 素子、配列内の要素の位置は、その要素によって定義されます。 index、通常は ゼロから始まる.

たとえば、整数の配列を考えてみましょう。 [10, 20, 30, 40, 50]。 ここで、要素は、 20 のインデックスがあります 1:

Python配列のインデックス付け

複数あります 利点 データを保存するために配列を使用する方法。 たとえば、メモリ レイアウトにより、配列では次のことが可能になります。 O(1) インデックスによって要素にアクセスするときの (一定の) 時間計算量。 これは、要素へのランダム アクセスが必要な場合に特に有益です。 さらに、配列は次の場所に保存されます。 連続したメモリ位置これにより、キャッシュの局所性が向上し、特定の操作における全体的なパフォーマンスの向上につながる可能性があります。 配列を使用するもう XNUMX つの注目すべき利点は、配列は一度宣言されると固定サイズになるため、メモリの管理が容易になり、予期しないオーバーフローやメモリ不足エラーを回避できることです。

Note: 配列は、次のようなシナリオで特に役立ちます。 コレクションのサイズは事前にわかっており、一定のままです、またはランダムアクセスが挿入や削除よりも頻繁に行われる場合。

一方、配列には独自のセットが付属しています。 制限。 従来のアレイの主な制限の XNUMX つは、 固定サイズ。 配列が作成されると、そのサイズは変更できません。 これにより、メモリの浪費 (配列が大きすぎる場合) やサイズ変更の必要性 (配列が小さすぎる場合) などの問題が発生する可能性があります。 それに加えて、配列の途中で要素を挿入または削除するには要素を移動する必要があるため、 O(N) これらの操作の時間の複雑さ。

これをすべてまとめるために、このガイドの最初にある曲のプレイリストの例を使用して、配列の主な特性を説明しましょう。 配列は次のようなデータ構造です。

  • インデックスが付けられています: プレイリストの各曲に番号 (1、2、3、…) があるのと同じように、配列内の各要素にはインデックスがあります。 ただし、ほとんどのプログラミング言語では、インデックスは 0 から始まります。つまり、最初の項目はインデックス 0、1 番目の項目はインデックス XNUMX というようになります。

  • 固定サイズあり: たとえば 10 曲のプレイリストを作成する場合、最初に 11 曲を削除しないと XNUMX 曲目を追加できません。 同様に、配列のサイズは固定です。 特定のサイズの配列を作成すると、その容量を超える項目を追加することはできません。

  • 均質である: プレイリスト内のすべての曲は音楽トラックです。 同様に、配列内のすべての要素は同じ型です。 整数の配列がある場合、そこにテキスト文字列を突然格納することはできません。

  • 直接アクセス可能: プレイリストの 7 番目の曲を聴きたい場合は、その曲に直接ジャンプできます。 同様に、配列の場合、インデックスがわかっていれば、任意の要素に即座にアクセスできます。

  • 連続したメモリ: これはもう少し技術的な話になります。 配列がコンピューターのメモリ内に作成されると、その配列はメモリの連続ブロックを占有します。 学校の隣り合ったロッカーの列のようなものだと考えてください。 各ロッカーは隙間なく隣り合っています。

Python と配列

柔軟性と使いやすさで知られる Python は、配列を操作するための複数の方法を提供します。 Python には他の言語のようなネイティブの配列データ構造はありませんが、同様に機能し、さらには拡張機能を提供できる強力な代替手段が提供されます。

一目見ただけで、 パイソンのリスト 配列と同義に見えるかもしれませんが、考慮すべき微妙な違いやニュアンスがあります。

リスト 配列
組み込みの Python データ構造 Python ではネイティブではありません - `array` モジュールから来ています
ダイナミックサイズ 固定(定義済み)サイズ
さまざまなデータ型のアイテムを保持できる 同じ種類のアイテムを保持する
操作用のさまざまな組み込みメソッドを提供する 外部モジュールをインポートする必要がある
O(1) アクセス操作の時間の複雑さ O(1) アクセス操作の時間の複雑さ
より多くのメモリを消費する メモリ効率の向上

この表を見ると、次のような疑問が自然に生まれます。 「いつどれを使うの?」。 動的に拡大または縮小でき、混合データ型を保持できるコレクションが必要な場合は、Python のリストが最適です。 ただし、同じ型の要素を含むよりメモリ効率の高いコレクションが必要なシナリオでは、Python の使用を検討することをお勧めします。 array モジュールまたは NumPy などの外部ライブラリ。

  配列 Pythonのモジュール

ほとんどの開発者は、Python で配列について考えるとき、デフォルトでリストについて考えることがよくあります。 ただし、Python は組み込みの関数を通じて、より特殊な配列構造を提供します。 array モジュール。 このモジュールは、Python の基本的な C スタイル データ型のスペース効率の高いストレージを提供します。

Python リストは非常に汎用性が高く、あらゆる種類のオブジェクトを保存できますが、特に整数や浮動小数点などの基本的なデータ型のコレクションのみを保存する必要がある場合には、過剰になる場合があります。 の array モジュールは、特定のデータ型のリストよりもメモリ効率の高い配列を作成する方法を提供します。

配列の作成

使用するには array モジュールの場合は、まずインポートする必要があります。

from array import array

インポートしたら、次を使用して配列を作成できます。 array() ビルダー:

arr = array('i', [1, 2, 3, 4, 5])
print(arr)

ここで、 'i' 引数は、配列に署名されたデータを格納することを示します 整数。 他にもいくつかのタイプ コードが利用可能です。 'f' フロートと 'd' ダブルス用。

要素へのアクセスと変更

リストの場合と同じように、配列内の要素にアクセスして変更できます。

print(arr[2]) 

次に、要素の値を次のように変更して要素を変更しましょう。 6:

arr[2] = 6
print(arr) 

配列メソッド

  array モジュールには、配列を操作するためのいくつかのメソッドが用意されています。

  • append() – 配列の末尾に要素を追加します。

    arr.append(7)
    print(arr) 
  • extend() – 反復可能な要素を末尾に追加します。

    arr.extend([8, 9])
    print(arr) 
  • pop() – 指定された位置にある要素を削除して返します。

    arr.pop(2)
    print(arr) 
  • remove(): 指定された値の最初の出現を削除します:

    arr.remove(2)
    print(arr) 
  • reverse(): 配列の順序を逆にします。

    arr.reverse()
    print(arr) 

注: ここにリストした以外にも多くの方法があります。 を参照してください。 Pythonの公式ドキュメント で使用可能なすべてのメソッドのリストを表示するには、 array モジュールを開きます。

一方、 array モジュールは、基本的なデータ型を格納するためのよりメモリ効率の高い方法を提供します。そのモジュールを覚えておくことが重要です。 制限。 リストとは異なり、配列は 。 これは、配列内のすべての要素が同じ型である必要があることを意味します。 また、保管のみ可能です。 基本的な C スタイルのデータ型 配列で。 カスタム オブジェクトまたは他の Python タイプを保存する必要がある場合は、リストまたは別のデータ構造を使用する必要があります。

NumPy 配列

NumPy (Numerical Python の略) は、Python での数値計算のための基礎パッケージです。 その主な特徴の XNUMX つは、その強力な機能です。 N次元配列オブジェクト、数学的、論理的、形状操作などを含む、配列に対する高速な操作を提供します。

NumPy 配列は Python の組み込み配列よりも多用途です array モジュールであり、データ サイエンスおよび機械学習プロジェクトの定番です。

NumPy 配列を使用する理由

最初に頭に浮かぶのは パフォーマンス。 NumPy 配列は C で実装されており、最適化されたアルゴリズムと連続メモリ ストレージの利点により、効率的なメモリ ストレージと高速な操作が可能になります。

Python の組み込みリストと配列は XNUMX 次元ですが、NumPy 配列は 多次元、行列やテンソルを表現するのに最適です。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

最後に、NumPy は 膨大な機能 基本的な算術演算から高度な数学演算、再形成、分割などまで、これらの配列を操作します。

注: データのサイズが事前にわかっている場合は、配列 (特に NumPy) にメモリを事前に割り当てると、パフォーマンスの向上につながる可能性があります。

NumPy 配列の作成

NumPy を使用するには、まずそれをインストールする必要があります (pip install numpy) そしてそれをインポートします。

import numpy as np

インポートしたら、次を使用して NumPy 配列を作成できます。 array() 関数:

arr = np.array([1, 2, 3, 4, 5])
print(arr) 

多次元配列を作成することもできます。

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

これは私たちに与えるでしょう:

[[1 2 3] [4 5 6] [7 8 9]]

配列を作成するこれらの基本的な方法に加えて、NumPy は配列を作成するための他の賢い方法を提供します。 そのうちの XNUMX つは、 arange() 方法。 定期的に値が増加する配列を作成します。

arr = np.arange(10)
print(arr) 

もうXNUMXつは linspace() このメソッドは、指定された開始値と終了値の間で等間隔に配置された、指定された数の要素を含む配列を作成します。

even_space = np.linspace(0, 1, 5)
print(even_space) 

要素へのアクセスと変更

NumPy 配列内の要素へのアクセスと変更は直感的に行えます。

print(arr[2]) arr[2] = 6
print(arr) 

多次元配列に対してもほぼ同じことを行います。

print(matrix[1, 2]) matrix[1, 2] = 10
print(matrix)

XNUMX行目の要素(インデックス)の値を変更します。 1) と XNUMX 番目の列 (インデックス 2):

[[1 2 3] [4 5 20] [7 8 9]]

配列の形状の変更

NumPy は、配列を操作および操作するための多くの関数とメソッドを提供します。 たとえば、次のように使用できます。 reshape() メソッド 配列の形状を変更する。 単純な配列があるとします。

import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Original Array:")
print(arr) 

そして、それを 3×4 行列に再形成したいと思います。 あなたがしなければならないのは、 reshape() 必要な寸法を引数として渡すメソッド:


reshaped_arr = arr.reshape(3, 4)
print("Reshaped Array (3x4):")
print(reshaped_arr)

これは次の結果になります:

Reshaped Array (3x4):
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]

行列の乗算

  numpy.dot() メソッドが使用されるのは 行列乗算。 XNUMX つの配列のドット積を返します。 XNUMX 次元配列の場合は、 内部製品 配列の。 2 次元配列の場合、これは次と同等です。 行列乗算、NDの場合は、 和積 最初の配列の最後の軸と XNUMX 番目の配列の最後から XNUMX 番目の軸にわたって実行されます。

どのように機能するかを見てみましょう。 まず、1 つの XNUMX 次元配列のドット積 (ベクトルの内積) を計算しましょう。

import numpy as np vec1 = np.array([1, 2, 3])
vec2 = np.array([4, 5, 6])
dot_product_1d = np.dot(vec1, vec2) print("Dot product of two 1-D arrays:")
print(dot_product_1d) 

これは次の結果になります:

Dot product of two 1-D arrays:
32

32 実際、これは XNUMX つの配列の内積です。 (14 + 25 + 3*6)。 次に、2 つの XNUMX 次元配列の行列乗算を実行できます。


mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[2, 0], [1, 3]])
matrix_product = np.dot(mat1, mat2) print("Matrix multiplication of two 2-D arrays:")
print(matrix_product) 

それは私たちに与えるでしょう:

Matrix multiplication of two 2-D arrays:
[[ 4 6] [10 12]]

NumPy 配列は、Python の組み込みリストよりも大幅に進歩しています。 array 特に科学的および数学的計算用のモジュール。 NumPy ライブラリが提供する豊富な機能とその効率性により、Python で数値演算を実行したい人にとって不可欠なツールとなっています。

まとめ

コンピューター サイエンスとプログラミングの基礎である配列は、さまざまなアプリケーションやドメインにわたってその価値を何度も証明してきました。 Python では、この基本的なデータ構造は、リストなどのさまざまな具体化を通じて、 array モジュールと強力な NumPy 配列は、開発者に効率性、多用途性、シンプルさの融合を提供します。

このガイドでは、配列の基本的な概念から Python での実際のアプリケーションまでを説明してきました。 メモリが連続しているという性質を持つ配列がどのようにアクセス時間を短縮するのか、また Python の動的リストがどのように柔軟性の層をもたらすのかを見てきました。 また、配列が数値計算のための強力なツールに変わる NumPy の特殊な世界についても詳しく掘り下げました。

タイムスタンプ:

より多くの スタックアバス