💭

NumPyのインストール 〜 arrayの基本

に公開

はじめに

本記事は「Pythonで数値計算を行うためのNumPy入門」シリーズの第1回です.
このシリーズでは, "NumPyのよく使われる機能を分野ごとに理解すること" を目標としています.

Pythonで数値計算を行う際に欠かせないライブラリ「NumPy」について,基礎から応用まで体系的に学べます.

シリーズ構成予定(全10記事)

  1. NumPyのインストール 〜 arrayの基本(本記事)
  2. 配列の追加・挿入・コピー(公開後にリンクを追加する予定)
  3. 配列の作成(ones / zeros / arange / linspace)(公開後にリンクを追加する予定)
  4. 配列の結合(hstack / vstack)(公開後にリンクを追加する予定)
  5. 条件抽出と検索(where / clip / unique)(公開後にリンクを追加する予定)
  6. 統計処理(mean / std / median ほか)(公開後にリンクを追加する予定)
  7. 線形代数(dot / inv / det / norm)(公開後にリンクを追加する予定)
  8. 乱数生成(rand / randint / normal)(公開後にリンクを追加する予定)
  9. 三角関数と角度変換(sin / arctan2 ほか)(公開後にリンクを追加する予定)
  10. ファイル入出力(savetxt / loadtxt)(公開後にリンクを追加する予定)

私のNumpyライブラリのバージョンは "1.26.4" です.

本記事のゴール

本記事では,以下内容を目標とします.

  • NumPyとは何か
  • インストール方法(pip / conda)
  • np.array() の使い方
  • shapesize の確認方法
  • Pythonのリストとの違い

Numpyとは?

"NumPy (Numerical Python)" は,Pythonで数値計算を高速かつ効率的に行うためのライブラリです.

Numpyの特徴を以下にまとめます.

機能 説明
高速計算 C言語実装により高速
ベクトル・行列演算が簡単 np.dotnp.linalg.inv などを使用
科学技術計算でも使用 シミュレーション,物理,ロボット工学にも活用

NumPyの中心となるのが, "ndarray`(多次元配列)" です.Python標準のリストよりも高速に計算が行えます.

NumPyのインストール方法

NumPyを使用するには.事前にインストールが必要です.

pip を使う場合(公式Pythonインストール)

pip install numpy

conda を使う場合(Anaconda環境)

conda install numpy

上記の2通りで,Pythonをインストールすることができます.
Pythonをインストールした時に,Python公式を経由した際は "pip" により "Numpy" をインストールし,Anaconda環境を経由した際は "conda" により "Numpy" をインストールした方が良いです.

ndarray の基本:np.array() を使ってみよう

NumPyを使うためには,まずライブラリの読み込みから始めます.

import numpy as np

numpyライブラリを "np" という名前として,扱えるようにライブラリを読み込んでいます.
以降では "np" という名前を使っていきます.

その後, np.array()を用いて配列(ndarray)を作ります.

以下は1次元配列(ベクトル)の例です.

a = np.array([1, 2, 3])
print(a)
# 出力: [1 2 3]

以下は2次元配列(行列)の例です.

b = np.array([[1, 2, 3], [4, 5, 6]])
print(b)
# 出力:
# [[1 2 3]
#  [4 5 6]]

shapesize の確認

NumPy配列には,以下のような属性があります.

属性 説明
shape 配列の「形(行数, 列数など)」 (2, 3)
size 全要素数 6
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b.shape)  # 出力: (2, 3)
print(b.size)   # 出力:  6

Pythonのリストとの違い

以下のコードを比較してみましょう.

# Pythonリストの計算
lst = [1, 2, 3]
print(lst * 2)
# 出力: [1, 2, 3, 1, 2, 3]

# NumPyの計算
arr = np.array([1, 2, 3])
print(arr * 2)
# 出力: [2 4 6]
  • リストは「要素の繰り返し」
  • NumPyは「数値計算として処理」

Pythonリストとの違い(NumPyが速い理由)

項目 Pythonのリスト NumPy配列
データの保存方式 別メモリ上に保持 メモリ上に連続で保持
計算速度 遅い 非常に速い
ベクトル演算 for文が必要 arr * 2

NumPy配列は,データをメモリ上に連続で保持しているから,処理が早くなる.また,C言語で実装されているので,処理が高速となる.

PythonのリストとNumPy配列でのデータ保存方式が異なる理由を下表にまとめた.

項目 Pythonリスト NumPy配列
格納方式 間接アドレス方式(ポインタの配列) 直接アドレス方式(連続メモリ)
要素の型 任意混在(文字列・整数・オブジェクトなど) 同じ型のみ
メモリサイズ 要素サイズがバラバラ 全要素同じサイズ
次要素へのアクセス +1ポインタ分進めるだけ 要素サイズ × nバイト足す
メリット 柔軟性高い 高速・メモリ効率良い

Pythonリストは要素の型が混在しても良いため,格納方式として "間接アドレス方式" を採用している.
NumPy配列は要素の型が同じ型のみのため,格納方式として "直接アドレス方式" を採用している.

ここで,"直接アドレス方式" と "間接アドレス方式" に関して説明します.
以下は,"直接アドレス方式" です.

以下は,"間接アドレス方式" です.

"間接アドレス方式" ではデータを取得するのに必要な処理数が2回なのに対して,"直接アドレス方式" ではデータを取得するのに必要な処理数が1回です.そのため,"直接アドレス方式" は "オーバーヘッド(付加的な処理)" が少ないから,"間接アドレス方式" と比べて処理時間が短くなります.
配列の要素数が多くなるほで,"オーバーヘッド" によって処理時間の違いが顕著になります.

終わりに

本記事では,Numpyに関する簡単な情報を説明しました.
以下にNumpyの特徴をまとめます.

  • NumPyは数値計算を高速かつ効率的に行うライブラリ
  • np.array() を使って多次元配列(ndarray)を作る
  • shape と size で配列の情報を確認
  • Pythonのリストとは動作が異なる

次回予告

第2回では,以下のような「配列の操作」に焦点を当てます.

  • np.append()(追加)
  • np.insert()(挿入)
  • np.copy()(コピー)

配列操作の基礎が身につくと,データ加工や機械学習の前処理,ロボットなどの様々な分野に応用できます.

参考文献

本記事を作成するに当たって参考にしたサイトをまとめました.

Discussion