[Python] NumPy – np.ndarrayの使い方
NumPyのnp.ndarray
は、多次元配列を扱うための基本的なデータ構造です。
np.array()関数
を使ってリストやタプルからndarray
を作成できます。
ndarray
は、要素の型が同じで、効率的なメモリ管理と高速な数値計算が可能です。
属性として、shape
(配列の形状)、dtype
(データ型)、size
(要素数)などがあり、メソッドとしてreshape()
やtranspose()
などが利用できます。
np.ndarrayとは
np.ndarray
は、NumPyライブラリで提供される多次元配列オブジェクトです。
Pythonのリストやタプルと異なり、ndarray
は同じデータ型の要素を持つため、数値計算やデータ処理において効率的に動作します。
ndarray
は、任意の次元を持つ配列を表現でき、行列演算やブロードキャスト機能を利用することで、複雑な計算を簡潔に行うことができます。
また、NumPyは数値計算に特化した多くの関数を提供しており、データ分析や機械学習などの分野で広く利用されています。
ndarray
は、データの格納、操作、計算を一元的に行うための強力なツールです。
ndarrayの基本的な作成方法
np.array()を使ったndarrayの作成
np.array()関数
を使用することで、リストやタプルから簡単にndarray
を作成できます。
以下はその例です。
import numpy as np
# リストからndarrayを作成
array_1d = np.array([1, 2, 3, 4, 5])
print(array_1d)
[1 2 3 4 5]
データ型を指定してndarrayを作成する
np.array()関数
では、dtype
引数を使ってデータ型を指定することができます。
例えば、整数型や浮動小数点型を指定できます。
import numpy as np
# 整数型のndarrayを作成
array_int = np.array([1, 2, 3], dtype=int)
print(array_int)
# 浮動小数点型のndarrayを作成
array_float = np.array([1, 2, 3], dtype=float)
print(array_float)
[1 2 3]
[1. 2. 3.]
多次元配列の作成
np.array()
を使って多次元配列を作成することも可能です。
以下の例では、2次元配列を作成しています。
import numpy as np
# 2次元配列を作成
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d)
[[1 2 3]
[4 5 6]]
特殊なndarrayの作成方法(zeros, ones, empty, arange, linspace)
NumPyには、特定の形状や値を持つndarray
を簡単に作成するための関数がいくつか用意されています。
以下に代表的なものを示します。
関数名 | 説明 | 例 |
---|---|---|
np.zeros | ゼロで初期化された配列を作成 | np.zeros((2, 3)) |
np.ones | 一で初期化された配列を作成 | np.ones((2, 3)) |
np.empty | 初期化されていない配列を作成 | np.empty((2, 3)) |
np.arange | 指定した範囲の配列を作成 | np.arange(0, 10, 2) |
np.linspace | 指定した範囲を等間隔で分割 | np.linspace(0, 1, 5) |
これらの関数を使うことで、特定の条件に応じた配列を簡単に作成することができます。
ndarrayの属性
NumPyのndarray
には、配列の特性を知るためのさまざまな属性があります。
これらの属性を利用することで、配列の形状やデータ型、メモリ使用量などを簡単に確認できます。
以下に主要な属性を紹介します。
shape(配列の形状)
shape
属性は、配列の各次元のサイズをタプルで返します。
例えば、2次元配列の場合、行数と列数が表示されます。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d.shape)
(2, 3)
ndim(次元数)
ndim
属性は、配列の次元数を返します。
1次元配列、2次元配列、3次元配列など、次元の深さを知ることができます。
import numpy as np
array_1d = np.array([1, 2, 3])
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_1d.ndim) # 1次元
print(array_2d.ndim) # 2次元
1
2
size(要素数)
size
属性は、配列内の要素の総数を返します。
配列の全要素数を把握するのに便利です。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d.size)
6
dtype(データ型)
dtype
属性は、配列の要素のデータ型を返します。
NumPyは多くのデータ型をサポートしており、配列のデータ型を確認することができます。
import numpy as np
array_float = np.array([1.0, 2.0, 3.0])
print(array_float.dtype)
float64
itemsize(要素のサイズ)
itemsize
属性は、配列の各要素が占めるメモリサイズ(バイト単位)を返します。
データ型によって異なるサイズを持ちます。
import numpy as np
array_int = np.array([1, 2, 3], dtype=int)
print(array_int.itemsize)
8
nbytes(配列全体のメモリサイズ)
nbytes
属性は、配列全体が占めるメモリサイズ(バイト単位)を返します。
要素数と要素のサイズを掛け算した結果です。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d.nbytes)
48
これらの属性を活用することで、ndarray
の特性を把握し、効率的なデータ処理を行うことができます。
ndarrayのインデックスとスライス
NumPyのndarray
では、インデックスやスライスを使って配列の特定の要素や部分を簡単に取得できます。
以下に、さまざまなインデックスとスライスの方法を紹介します。
1次元配列のインデックスとスライス
1次元配列では、インデックスを使って特定の要素を取得したり、スライスを使って部分配列を取得したりできます。
インデックスは0から始まります。
import numpy as np
array_1d = np.array([10, 20, 30, 40, 50])
# インデックスを使って要素を取得
print(array_1d[2]) # 30
# スライスを使って部分配列を取得
print(array_1d[1:4]) # [20 30 40]
30
[20 30 40]
2次元配列のインデックスとスライス
2次元配列では、行と列のインデックスを指定して要素を取得します。
また、スライスを使って行や列を選択することもできます。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 特定の要素を取得
print(array_2d[1, 2]) # 6
# 行をスライスして取得
print(array_2d[0:2]) # [[1 2 3] [4 5 6]]
# 列をスライスして取得
print(array_2d[:, 1]) # [2 5 8]
6
[[1 2 3]
[4 5 6]]
[2 5 8]
多次元配列のインデックスとスライス
多次元配列でも同様に、各次元のインデックスを指定して要素を取得できます。
以下は3次元配列の例です。
import numpy as np
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 特定の要素を取得
print(array_3d[1, 0, 1]) # 6
# スライスを使って部分配列を取得
print(array_3d[:, 1, :]) # [[3 4] [7 8]]
6
[[3 4]
[7 8]]
ブールインデックス
ブールインデックスを使用すると、条件に基づいて配列の要素を選択できます。
条件を満たす要素だけを取得することができます。
import numpy as np
array = np.array([1, 2, 3, 4, 5])
# 条件を満たす要素を取得
print(array[array > 3]) # [4 5]
[4 5]
条件を使ったインデックス
条件を使ったインデックスを利用することで、特定の条件に基づいて要素を選択することができます。
以下は、配列内の偶数を取得する例です。
import numpy as np
array = np.array([1, 2, 3, 4, 5, 6])
# 偶数を取得
even_numbers = array[array % 2 == 0]
print(even_numbers) # [2 4 6]
[2 4 6]
これらのインデックスとスライスの技術を活用することで、ndarray
のデータを効率的に操作し、必要な情報を簡単に取得することができます。
ndarrayの操作
NumPyのndarray
では、配列の形状変更や結合、分割など、さまざまな操作を行うことができます。
以下に代表的な操作を紹介します。
reshape()による形状変更
reshape()メソッド
を使用すると、配列の形状を変更することができます。
元のデータはそのままで、異なる次元の配列に変換できます。
import numpy as np
array = np.array([1, 2, 3, 4, 5, 6])
reshaped_array = array.reshape((2, 3)) # 2行3列に変更
print(reshaped_array)
[[1 2 3]
[4 5 6]]
transpose()による転置
transpose()メソッド
を使用すると、配列の次元を入れ替えることができます。
特に2次元配列の場合、行と列を入れ替えることができます。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
transposed_array = array_2d.transpose() # 転置
print(transposed_array)
[[1 4]
[2 5]
[3 6]]
flatten()による1次元化
flatten()メソッド
を使用すると、多次元配列を1次元配列に変換することができます。
元の配列のデータはそのまま保持されます。
import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
flattened_array = array_2d.flatten() # 1次元化
print(flattened_array)
[1 2 3 4 5 6]
concatenate()による配列の結合
concatenate()関数
を使用すると、複数の配列を結合することができます。
結合する軸を指定することも可能です。
import numpy as np
array1 = np.array([[1, 2, 3]])
array2 = np.array([[4, 5, 6]])
concatenated_array = np.concatenate((array1, array2), axis=0) # 縦に結合
print(concatenated_array)
[[1 2 3]
[4 5 6]]
split()による配列の分割
split()関数
を使用すると、配列を指定した数の部分に分割することができます。
分割する軸を指定することも可能です。
import numpy as np
array = np.array([1, 2, 3, 4, 5, 6])
split_arrays = np.split(array, 3) # 3つに分割
print(split_arrays)
[array([1, 2]), array([3, 4]), array([5, 6])]
これらの操作を活用することで、ndarray
のデータを柔軟に扱い、さまざまな形状や構造に変換することができます。
ndarrayの計算
NumPyのndarray
では、配列に対してさまざまな計算を行うことができます。
要素ごとの演算や集約関数、行列演算など、効率的にデータを処理するための機能が豊富に用意されています。
以下に代表的な計算方法を紹介します。
要素ごとの演算
NumPyでは、配列同士の演算を要素ごとに行うことができます。
これにより、配列の各要素に対して一括で計算を行うことが可能です。
import numpy as np
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
# 要素ごとの加算
result_add = array1 + array2
print(result_add) # [5 7 9]
# 要素ごとの乗算
result_mul = array1 * array2
print(result_mul) # [ 4 10 18]
[5 7 9]
[ 4 10 18]
ブロードキャスト機能
NumPyのブロードキャスト機能を使用すると、異なる形状の配列同士の演算が可能です。
小さい配列が自動的に拡張されて、大きい配列と同じ形状に合わせられます。
import numpy as np
array = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 10
# スカラーとの演算
result = array + scalar
print(result)
[[11 12 13]
[14 15 16]]
集約関数(sum, mean, max, min, etc.)
NumPyには、配列の要素を集約するための関数が多数用意されています。
これにより、合計や平均、最大値、最小値などを簡単に計算できます。
import numpy as np
array = np.array([1, 2, 3, 4, 5])
# 合計
total = np.sum(array)
print(total) # 15
# 平均
average = np.mean(array)
print(average) # 3.0
# 最大値
maximum = np.max(array)
print(maximum) # 5
# 最小値
minimum = np.min(array)
print(minimum) # 1
15
3.0
5
1
行列演算(dot, matmul)
NumPyでは、行列演算を行うための関数も用意されています。
dot()
やmatmul()
を使用することで、行列の積を計算できます。
import numpy as np
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 行列の積
result_dot = np.dot(matrix1, matrix2)
print(result_dot)
# または、matmulを使用
result_matmul = np.matmul(matrix1, matrix2)
print(result_matmul)
[[19 22]
[43 50]]
[[19 22]
[43 50]]
比較演算と論理演算
NumPyでは、配列に対して比較演算や論理演算を行うこともできます。
これにより、条件に基づいて要素を選択したり、真偽値の配列を生成したりできます。
import numpy as np
array = np.array([1, 2, 3, 4, 5])
# 比較演算
greater_than_two = array > 2
print(greater_than_two) # [False False True True True]
# 論理演算
logical_and = (array > 2) & (array < 5)
print(logical_and) # [False False True True False]
[False False True True True]
[False False True True False]
これらの計算機能を活用することで、ndarray
を用いたデータ処理や分析が効率的に行えます。
応用例
NumPyのndarray
は、さまざまな分野で広く利用されています。
以下に、具体的な応用例をいくつか紹介します。
画像データの処理におけるndarrayの利用
画像は通常、ピクセルの集まりとして表現され、各ピクセルは色の情報を持っています。
NumPyのndarray
を使用することで、画像データを効率的に処理できます。
例えば、画像を読み込んで配列に変換し、フィルタリングや変換を行うことができます。
以下は、画像のグレースケール変換の例です。
import numpy as np
from PIL import Image
# 画像を読み込む
image = Image.open('image.jpg')
image_array = np.array(image)
# グレースケール変換
gray_image = np.dot(image_array[..., :3], [0.2989, 0.5870, 0.1140])
gray_image = gray_image.astype(np.uint8)
# グレースケール画像を保存
Image.fromarray(gray_image).save('gray_image.jpg')
このように、ndarray
を使うことで画像処理が簡単に行えます。
科学計算におけるndarrayの利用
科学計算では、大量のデータを扱うことが一般的です。
NumPyのndarray
は、効率的なメモリ管理と高速な計算を提供するため、数値シミュレーションやデータ解析に適しています。
例えば、物理シミュレーションにおける運動方程式の解法に利用できます。
import numpy as np
# 時間の配列を生成
time = np.linspace(0, 10, 100) # 0から10までの100点
# 物体の位置を計算 (s = ut + 1/2 at^2)
initial_velocity = 0 # 初速度
acceleration = 9.81 # 重力加速度
position = initial_velocity * time + 0.5 * acceleration * time**2
# 結果をプロット
import matplotlib.pyplot as plt
plt.plot(time, position)
plt.title('物体の位置 vs 時間')
plt.xlabel('時間 (s)')
plt.ylabel('位置 (m)')
plt.show()
このように、科学計算においてもndarray
は非常に有用です。
機械学習におけるndarrayの利用
機械学習では、データの前処理やモデルのトレーニングにndarray
が頻繁に使用されます。
データセットをndarray
に変換することで、効率的に計算を行うことができます。
以下は、簡単な線形回帰モデルのトレーニングの例です。
import numpy as np
from sklearn.linear_model import LinearRegression
# サンプルデータ
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 3, 5, 7, 11])
# 線形回帰モデルの作成
model = LinearRegression()
model.fit(X, y)
# 予測
predictions = model.predict(X)
print(predictions)
このように、機械学習の分野でもndarray
はデータの管理や計算において重要な役割を果たしています。
これらの応用例からもわかるように、NumPyのndarray
は多くの分野で非常に強力なツールとして利用されています。
まとめ
この記事では、NumPyのndarray
について、その基本的な作成方法や属性、インデックスとスライス、さまざまな操作、計算方法、応用例などを詳しく解説しました。
これにより、ndarray
を用いたデータ処理や分析の幅広い可能性を理解することができるでしょう。
今後は、実際のプロジェクトやデータ分析において、NumPyを積極的に活用し、効率的なデータ処理を行ってみてください。