Pythonのリストと配列とnumpy.ndarrayの違いと使い分け

Pythonには、組み込み型としてリストlist、標準ライブラリに配列arrayが用意されています。さらに数値計算ライブラリNumPyをインストールすると多次元配列numpy.ndarrayを使うこともできます。 それぞれの違いと使い分けについて説明します。 表で表現されるような二次元データを扱うのに便利なデータ分析ライブラリpandasについても最後に少し触れる。

リストと配列とnumpy.ndarrayの違い

リスト - list

組み込み型 何もimportせずに使える

異なる型を格納できる リストのリストによって多次元配列を表現することも可能

厳密には配列と異なるが、配列ライクな簡単な処理を行うのであればリストlistで十分な場合が多い

l = ['apple', 100, 0.123]
print(l)
# ['apple', 100, 0.123]

l_2d = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
print(l_2d)
# [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

print(l_2d[1][1])
# 4

組み込み関数のmax(), min(), sum(), len()を使って、最大値や最小値、合計、平均などを算出する例。len()は要素数を返す関数。

l_num = [0, 10, 20, 30]

print(min(l_num))
# 0

print(max(l_num))
# 30

print(sum(l_num))
# 60

print(sum(l_num) / len(l_num))
# 15.0

for文によるループ処理の例。

l_str = ['apple', 'orange', 'banana']

for s in l_str:
    print(s)
# apple
# orange
# banana

リストの要素の追加や削除については以下の記事を参照。

配列 - array

標準ライブラリのarrayモジュールをimportして使う 8.7. array — 効率のよい数値アレイ — Python 3.6.5 ドキュメント

同じ型しか格納できない 一次元配列のみ 型に制限がある以外はリストと同様の処理が可能

コンストラクタarray.array()で型コードを指定して生成します。型コードの一覧は公式ドキュメント参照。 型コードと一致しない型の要素は格納できない。

import array

arr_int = array.array('i', [0, 1, 2])
print(arr_int)
# array('i', [0, 1, 2])

arr_float = array.array('f', [0.0, 0.1, 0.2])
print(arr_float)
# array('f', [0.0, 0.10000000149011612, 0.20000000298023224])

# arr_int = array.array('i', [0, 0.1, 2])
# TypeError: integer argument expected, got float

リストと同様の処理が可能。

print(arr_int[1])
# 1

print(sum(arr_int))
# 3

多次元配列 - numpy.ndarray

NumPyをインストール、importして使う 同じ型しか格納できない object型で様々な型へのポインタを格納することはできる

多次元配列を表現できる 数値計算のためのメソッド・関数が豊富で、高速な演算が可能 行列演算や画像処理など様々な場面で使える

import numpy as np

arr = np.array([0, 1, 2])
print(arr)
# [0 1 2]

arr_2d = np.array([[0, 1, 2], [3, 4, 5]])
print(arr_2d)
# [[0 1 2]
#  [3 4 5]]

要素ごとに演算をしたり、行列積を求めたりできます。

arr_2d_sqrt = np.sqrt(arr_2d)
print(arr_2d_sqrt)
# [[0.         1.         1.41421356]
#  [1.73205081 2.         2.23606798]]

arr_1 = np.array([[1, 2], [3, 4]])
arr_2 = np.array([[1, 2, 3], [4, 5, 6]])

arr_product = np.dot(arr_1, arr_2)
print(arr_product)
# [[ 9 12 15]
#  [19 26 33]]

独断と偏見によるそれぞれの使い分け

いわゆる配列ライクな処理をするのであればリストlistで十分な場合が多い。 arrayは格納する要素の型が制限されているので厳密なメモリ管理が可能だが、特に気にする必要がなければlist、より効率的な数値計算を行いたければnumpy.ndarrayのほうが適当。メモリサイズ、メモリアドレスを必要とするような処理以外に使いどころはない(と思う)。 多次元配列を扱う場合や配列に対する数値計算(科学技術演算)を行う場合はNumPy配列numpy.ndarrayを使います。 コンピュータビジョンライブラリOpenCVや機械学習ライブラリscikit-learnなど多くのライブラリでNumPy配列numpy.ndarrayが使われているので、それらのライブラリを使うと自動的にnumpy.ndarrayを使うことになる。 なお、listとnumpy.ndarrayは相互に変換する事が可能。以下の記事を参照。

データ分析ライブラリpandas

表で表現されるような二次元データに対して統計的な処理を行う場合は、データ分析ライブラリpandasが便利。

Python Data Analysis Library — pandas: Python Data Analysis Library

pandasでは二次元データをpandas.DataFrameとして扱う。(pandas.Seiriesとして一次元データを扱うことも可能) pandas.DataFrameもpandas.Seriesも内部ではnumpy.ndarrayでデータを保持しているが、行・列ごとの操作や表計算ソフトにおけるピボットテーブルのような操作など、データ処理に便利な関数やメソッドが豊富に用意されています。 雰囲気は以下のような感じ。列ごとの平均値を算出したり、属性を指定して集計したりしています。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
df['sex'] = ['Female', 'Male', 'Male', 'Male', 'Female', 'Male']
print(df)
#          age state  point     sex
# name                             
# Alice     24    NY     64  Female
# Bob       42    CA     92    Male
# Charlie   18    CA     70    Male
# Dave      68    TX     70    Male
# Ellen     24    CA     88  Female
# Frank     30    NY     57    Male

print(df.mean())
# age      34.333333
# point    73.500000
# dtype: float64

print(df.pivot_table(index='state', columns='sex', aggfunc='mean'))
#          age        point      
# sex   Female  Male Female  Male
# state                          
# CA      24.0  30.0   88.0  81.0
# NY      24.0  30.0   64.0  57.0
# TX       NaN  68.0    NaN  70.0

例のような数値と文字列を含んだデータはNumPyだと扱いが面倒だが、pandasだと非常に簡単。 詳しい使い方などは以下の記事を参照。

シェア

関連カテゴリー

Python リスト NumPy pandas

Pythonで正規化・標準化(リスト、NumPy配列、pandas.DataFrame) Pythonでメソッドチェーンを改行して書く pandas参考書『Pythonによるデータ分析入門』の注意点 NumPy配列ndarrayとPython標準のリストを相互に変換 pandasからNumPyの関数などを使う方法(pd.np) pandas.DataFrame, SeriesとPython標準のリストを相互に変換 pandas.DataFrame, SeriesとNumPy配列ndarrayを相互に変換 『Python Data Science Handbook』(英語の無料オンライン版あり) 『Pythonデータサイエンスハンドブック』は良書(NumPy, pandasほか) pandas参考書『Python for Data Analysis, 2nd Edition』 pandasでcsvファイルの書き出し・追記(to_csv) Pythonのast.literal_eval()で文字列をリストや辞書に変換 Pythonでe-Stat APIを使って政府統計データを一括ダウンロード pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出 NumPy配列ndarrayの条件を満たす要素数をカウント

Last Updated: 6/26/2019, 10:34:03 PM