[Python] NumPy – np.ndarrayの使い方

NumPyのnp.ndarrayは、多次元配列を扱うための基本的なデータ構造です。

np.array()関数を使ってリストやタプルからndarrayを作成できます。

ndarrayは、要素の型が同じで、効率的なメモリ管理と高速な数値計算が可能です。

属性として、shape(配列の形状)、dtype(データ型)、size(要素数)などがあり、メソッドとしてreshape()transpose()などが利用できます。

この記事でわかること
  • NumPyのndarrayの基本的な使い方
  • 配列の作成方法や属性の理解
  • インデックスやスライスの操作方法
  • 配列の計算や演算の実施方法
  • 画像処理や機械学習への応用例

目次から探す

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は多くの分野で非常に強力なツールとして利用されています。

よくある質問

ndarrayのサイズを変更するにはどうすればいいですか?

ndarrayのサイズを変更するには、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]]

ndarrayのデータ型を変更する方法は?

ndarrayのデータ型を変更するには、astype()メソッドを使用します。

このメソッドを使うことで、配列の要素のデータ型を指定した型に変換できます。

以下はその例です。

import numpy as np
array = np.array([1, 2, 3], dtype=int)
float_array = array.astype(float)  # 整数型から浮動小数点型に変換
print(float_array)
[1. 2. 3.]

ndarrayのコピーとビューの違いは?

ndarrayには、コピーとビューという2つの概念があります。

コピーは、元の配列のデータを新しい配列に複製することを意味し、元の配列を変更してもコピーには影響しません。

一方、ビューは元の配列のデータを参照するもので、元の配列を変更するとビューにも影響が及びます。

以下はその例です。

import numpy as np
array = np.array([1, 2, 3, 4, 5])
# コピーを作成
copy_array = array.copy()
copy_array[0] = 10
# ビューを作成
view_array = array[1:4]
view_array[0] = 20
print("元の配列:", array)  # [1 2 3 4 5]
print("コピー:", copy_array)  # [10 2 3 4 5]
print("ビュー:", view_array)  # [20 3 4]
元の配列: [1 2 3 4 5]
コピー: [10  2  3  4  5]
ビュー: [20  3  4]

このように、コピーとビューの違いを理解することで、ndarrayをより効果的に扱うことができます。

まとめ

この記事では、NumPyのndarrayについて、その基本的な作成方法や属性、インデックスとスライス、さまざまな操作、計算方法、応用例などを詳しく解説しました。

これにより、ndarrayを用いたデータ処理や分析の幅広い可能性を理解することができるでしょう。

今後は、実際のプロジェクトやデータ分析において、NumPyを積極的に活用し、効率的なデータ処理を行ってみてください。

  • URLをコピーしました!
目次から探す