NumPyによる高速な数値計算の実現

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)

タグ: NumPy ndarray 科学計算 配列操作 ランダム生成

7月21日 00:51 投稿