NumPy

【NumPy】NumPyのndarrayとPython組み込み型のlistとの違い ~なぜ分析でndarrayを使うのか~

【NumPy】NumPyのndarrayとPython組み込み型のlistとの違い _なぜ分析でndarrayを使うのか_
naoki-hn

Python でデータ分析では、NumPy の ndarray を使用します。これは、Python 組み込み型の list とは何が違うでしょうか。この記事では、NumPy の ndarray と Python 組み込み型の list の違いを解説します。

NumPy の ndarray 型と
Python 組み込み型の list

Python のデータ分析では、NumPy の ndarray 型を使用します。ndarray は以下のように Python 組み込み型である list 型データを使用して作成することができます。

import numpy as np

# list型
data = [1, 2, 3, 4, 5]
print(type(data))

# ndarray型
array_data = np.array(data)
print(type(array_data))
【実行結果】
<class 'list'>
<class 'numpy.ndarray'>

どちらも連続するシーケンスデータを扱うので同じように感じるかもしれません。

しかし、NumPy の ndarray 型は、大量データを高速に処理できるように設計されているため、大量データ分析では ndarray 型の使用が適切です。

この記事では、ndarraylist の違いを紹介していきます。

NumPy を最初学ぶと arrayndarray の違いに混乱するかもしれません。正確には、NumPy の配列型が ndarray であり、ndarray を生成する関数が array です。

Python の型の理解を深める

Python は動的型付け言語

Pythonは、動的型付け言語であり、型を指定する必要はありません。C/C++ や Java 等を経験された型にとっては、少し違和感を感じるかもしれません。

例えば、C 言語では、以下のように型をつけて変数を宣言します。その後に、変数に異なる型の値を代入しようとするとエラーとなります。

int x = 1;
x = "sample_text";    // <- ERROR

一方で、Python では同じようなコードを書いてもエラーにはなりません。これは、Python が実行時に動的に型を理解して適切に処理するためです。

x = 1
x = 'sample_text'

Python 3.5 から型ヒントが導入され、型の情報を追加できるようになっています。

x: int = 1

型ヒントは、強制されるものではありませんが、mypy を使ったチェックができたり、IDE での補完が強化されたりと効果的であるため、積極的に使用することをおすすめします。

Python の型は C 言語の構造体となっている

標準的な Python の言語自体は C 言語を使って実装されています(これを、CPython と言います)。他にも Java で実装されている Jython などもありますが、以降は CPython として説明していきます。

int 型について見てみると、Python の int は、C 言語の int とは違います。Python の int は、C 言語の構造体として定義されており、int の値の他にも色々な情報を持っています。以下が、Python の int のイメージです。

C言語のint Pythonのint 違い

これは、C 言語の int に比べて Python の int の方が、処理に要するオーバーヘッドが大きいということを意味しています。

注意点

上記図は、あくまでイメージであるため具体的な実装とは異なりますので、ご注意ください。

Python の list は任意の型の値で構成できる

次に、Python のリストを見てみます。Python のリストでは以下のように、複数の型を持つリストが定義できます。

data = [0, '1', True, 2.0]
data_types = [type(d) for d in data]

print(data)
print(data_types)
【実行結果】
[0, '1', True, 2.0]
[<class 'int'>, <class 'str'>, <class 'bool'>, <class 'float'>]

通常は、数値なら数値リスト、文字列なら文字列のリストとして使う方が多いと思いますが、Python では、上記のような使用できることを理解しておいてください。

では、これらを踏まえて ndarraylist の違いを見ていきましょう。

ndarraylistとの違い
~なぜ分析で ndarray を使うのか~

ndarray は処理に効率的なデータ構造となっている

NumPy の ndarray と Python 組み込みの listデータの構造が異なっています。

それぞれのイメージは以下の通りです。

numpyのndarrayとPython組み込み型のlist

ndarray は、連続するデータブロックの 1 つのポインタのみを持つような形となり、データのシーケンスはそこから連続するブロックに格納されます。配列データに、アクセスする際には、このポインタからデータを取得できるため高速です。

一方で、Python 組み込み型の list では、Python オブジェクトへのポインターのリストという構造となっています。Python のリストは様々な型を含められる特徴上、メモリ上で連続するブロックに格納されているとは限りません。

小さなデータサイズでは大きな影響は出ませんが、データ分析で扱いたいような大容量データのアクセスでは違いが出ます。データアクセスでは、連続するブロックにデータがある方が効率であり、データサイズが大きくなればなるほど、違いは顕著です。

このように、ndarray は大量データ分析に適したデータ構造を持っています。

注意点

上記図は、イメージであるため正確な実装とは異なる場合がありますので、ご注意ください。

ndarray には豊富なデータ操作のメソッドがたくさんある

NumPy の ndarray は、データ分析のために作られたものであるため、データ操作のためのメソッドが豊富に用意されています。

ndarray の公式ドキュメントはこちらを参考にしてください。ドキュメントの Methods 欄にデータ操作のためのメソッドが豊富に用意されています。

他のデータ分析ライブラリとの連携が容易

データ分析では、NumPy の他にも pandas や scikit-learn などがあります。これらのライブラリは、NumPy との連携を考慮した作りとなっているため、NumPy に慣れておくことはデータ分析を効率的に進めるために重要です。

Python で array 型という型を制限したものがあります。

import array
data = list(range(10))
array_data = array.array("i", data)
print(array_data)
【実行結果】
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

この例では、"i"を引数に指定して int 型に制限しているため、文字列などを入力するとエラーとなります。array 型は list に比べると効率がよい型です。

データ分析では、各種データ操作メソッドの豊富さや他ライブラリとの連携も考慮して ndarray を使うことをおすすめします。Python にも array という型があるということは覚えておいてください。

まとめ

NumPy の ndarray と Python 組み込み型の list の違いを解説しました。ndarraylist におけるデータ構造の側面から違いを説明しています。

データ分析で、NumPy を使う分には、この記事で紹介したような内容を意識する必要は正直ありませんが、NumPy の作りについて理解を深めておくことは、自身のレベルを上げるためにも非常に有効ですので、参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド

ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました