NumPyの高速処理能力を理解する
配列の属性(形状・データ型)の把握
基本的な配列操作の実装
正規分布を用いた乱数生成の応用
論理演算の配列処理
統計関数の活用
配列間の要素ごとの演算
一、NumPyの特徴
NumPy(Numerical Python)は、多次元配列を高速に処理するためのオープンソースライブラリです。Python標準のリスト処理と比べて、数値計算の効率性に優れています。
NumPyはndarrayというオブジェクトで多維配列を扱い、このオブジェクトは同型データを効率的に格納できる構造を持っています。
以下にndarrayの使用例を示します:
import numpy as np
# 成績データの配列作成
scores_data = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
scores_data
実行結果:
array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
ndarrayとPythonリストの処理速度比較
以下に処理速度の差を示すコード例を記載します:
import random
import time
import numpy as np
original_list = []
for _ in range(100000000):
original_list.append(random.random())
# Python標準処理
%time total1 = sum(original_list)
# NumPy処理
numpy_array = np.array(original_list)
%time total2 = np.sum(numpy_array)
処理結果(CPU時間):
- Python標準:1.13秒
- NumPy:0.134秒
二、C言語ベースの高速処理
NumPyはC言語で実装されており、GIL(グローバルインタプリタロック)を回避することで、Pythonの解釈処理に縛られません。この設計により、大規模データ処理においてPython純粋コードよりはるかに高速な処理が可能です。
ndarrayの主要属性
| 属性名 | 説明 |
|---|---|
| shape | 配列の次元形状(タプル形式) |
| ndim | 次元数 |
| size | 要素総数 |
| itemsize | 1要素のバイト数 |
| dtype | データ型 |
配列形状の確認
# 多様な形状を持つ配列の作成
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(a.shape) # (2, 3)
print(b.shape) # (4,)
print(c.shape) # (2, 2, 3)
データ型の指定
>>> type(scores_data.dtype)
<class 'numpy.dtype'>
# 作成時のデータ型指定例
np.array([[1,2,3],[4,5,6]], dtype=np.float32)
三、配列生成方法
0/1配列の生成
# 1で埋める
ones_array = np.ones((4,8), dtype=np.float64)
# 0で埋める
zeros_array = np.zeros_like(ones_array)
既存配列からの生成
original = np.array([[1,2,3],[4,5,6]])
copy1 = np.array(original) # シンタックス糖衣
copy2 = np.asarray(original) # 明示的変換
範囲指定配列
# 等差数列(指定要素数)
np.linspace(0, 100, 11) # [0, 10, ..., 100]
# 等差数列(指定ステップ)
np.arange(10, 50, 2) # [10, 12, ..., 48]
# 等比数列
np.logspace(0, 2, 3) # [1, 10, 100]
正規分布乱数生成
# 平均1.75、標準偏差1の正規分布(1億要素)
normal_data = np.random.normal(loc=1.75, scale=1, size=100000000)
# 均等分布(-1~1の範囲、1億要素)
uniform_data = np.random.uniform(low=-1, high=1, size=100000000)
四、配列のインデックスとスライス
多次元配列のアクセス
# 2次元配列のスライス例
stock_changes = np.array([[-0.0386, -1.4613, -0.7560],
[0.1234, 1.5678, -0.9876]])
print(stock_changes[0, 0:3]) # [-0.0386, -1.4613, -0.7560]
# 3次元配列のアクセス
multi_dim = np.array([[[1,2,3],[4,5,6]],
[[12,3,34],[5,6,7]]])
print(multi_dim[0, 0, 1]) # 2
配列形状の変更
# reshapeによる形状変換
reshaped = stock_changes.reshape(5, 4)
# resizeによるインプレース変更
stock_changes.resize((5, 4))
# 転置操作
transposed = stock_changes.T
print(transposed.shape) # (4, 5)