NumPy の加算で異なる形状の配列を扱う方法

PythonPythonBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、強力なPythonライブラリであるNumPyを使用して配列の加算を行う際に、異なる形状の配列をどのように扱うかを探っていきます。1次元、2次元、またはそれ以上の多次元配列を扱っている場合でも、正確かつ効率的な配列操作を行うための手法を学ぶことができます。

NumPy配列のはじめに

NumPyは、Pythonで科学計算を行うための強力なオープンソースライブラリです。このライブラリは、大規模な多次元配列や行列をサポートし、これらの配列に対して操作を行うための多数の高度な数学関数を提供します。NumPy配列は、多くの科学計算や機械学習タスクで使用される基本的なデータ構造です。

NumPy配列とは何か?

NumPy配列は、すべて同じ型の値のグリッドであり、正の整数のタプルによってインデックス付けされます。次元の数は配列のランク(階数)であり、配列の形状は各次元に沿った配列のサイズを示す整数のタプルです。

import numpy as np

## Create a 1D array
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)
## Output: [1 2 3 4 5]

## Create a 2D array
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
## Output: [[1 2 3]
##          [4 5 6]]

NumPy配列を使用する利点

  1. 効率的なデータ保存:NumPy配列はデータを連続したメモリブロックに保存するため、Pythonのリストと比較してメモリ効率が高くなります。
  2. 高速な計算:NumPyは配列を操作するための高度に最適化された関数や演算を提供しており、これらはCやFortranなどの低水準言語で実装されているため、純粋なPythonコードよりもはるかに高速です。
  3. 汎用性:NumPy配列は任意の次元数を持つことができ、幅広い数学演算をサポートするため、さまざまな科学やデータ分析タスクに適しています。
  4. 他のライブラリとの統合性:NumPyはPythonの科学計算エコシステムにおいて基本的なライブラリとして広く使用されており、Pandas、SciPy、Matplotlibなどの他の人気のあるライブラリともよく統合されます。

配列の形状の理解

NumPy配列の形状(shape)とは、各次元に沿った要素の数を指します。これは、各軸に沿った配列のサイズを指定する正の整数のタプルとして表されます。

配列の形状の取得

NumPy配列の形状は、shape属性を使用して取得できます。

import numpy as np

## 1D array
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d.shape)  ## Output: (5,)

## 2D array
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d.shape)  ## Output: (2, 3)

## 3D array
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3d.shape)  ## Output: (2, 2, 2)

配列の形状変更

NumPy配列の形状は、reshape()メソッドを使用して変更できます。新しい形状は、元の配列のサイズと互換性がある必要があります。

import numpy as np

## Reshape a 1D array to a 2D array
arr1d = np.array([1, 2, 3, 4, 5, 6])
arr2d = arr1d.reshape(2, 3)
print(arr2d)
## Output: [[1 2 3]
##          [4 5 6]]

## Reshape a 2D array to a 3D array
arr2d = np.array([[1, 2], [3, 4], [5, 6]])
arr3d = arr2d.reshape(3, 1, 2)
print(arr3d)
## Output: [[[1 2]]
##          [[3 4]]
##          [[5 6]]]

ブロードキャスト

NumPyはブロードキャスト(broadcasting)もサポートしており、これにより異なる形状の配列に対して演算を行うことができます。形状が互換性がない場合、NumPyは自動的に小さい方の配列の形状を大きい方の配列の形状に合わせます。

import numpy as np

## Broadcasting a 1D array with a 2D array
arr1d = np.array([1, 2, 3])
arr2d = np.array([[4, 5, 6], [7, 8, 9]])
result = arr1d + arr2d
print(result)
## Output: [[ 5  7  9]
##          [ 8 10 12]]

異なる形状の配列の加算

2つのNumPy配列を加算する場合、配列の形状は互換性がある必要があります。これは、配列が同じ形状であるか、少なくとも1つの次元がサイズ1(シングルトン次元)であり、他の配列の形状にブロードキャストできることを意味します。

同じ形状の配列の加算

配列が同じ形状の場合、+演算子を使用して要素ごとの加算を行うことができます。

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
result = arr1 + arr2
print(result)
## Output: [[ 6  8]
##          [10 12]]

異なる形状の配列の加算(ブロードキャスト)

配列が異なる形状の場合、NumPyは加算を行う前に配列を共通の形状にブロードキャストしようとします。ブロードキャストは、異なる形状の配列に対して演算を行うことができる強力な機能です。

import numpy as np

## Broadcasting a 1D array with a 2D array
arr1d = np.array([1, 2, 3])
arr2d = np.array([[4, 5, 6], [7, 8, 9]])
result = arr1d + arr2d
print(result)
## Output: [[ 5  7  9]
##          [ 8 10 12]]

## Broadcasting a scalar with a 2D array
scalar = 10
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
result = scalar + arr2d
print(result)
## Output: [[11 12 13]
##          [14 15 16]]

上記の例では、NumPyが自動的に1次元配列とスカラーを2次元配列の形状にブロードキャストし、加算を行うことができます。

互換性のない形状の処理

配列の形状が共通の形状にブロードキャストできない場合、NumPyはValueError例外を発生させます。

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6, 7], [8, 9, 10]])
result = arr1 + arr2
## ValueError: operands could not be broadcast together with shapes (2,2) (2,3)

このような場合、加算を行う前に、一方または両方の配列の形状を変更または転置して、形状を互換性のあるものにする必要があるかもしれません。

まとめ

このチュートリアルを終えることで、NumPyで加算を行う際に異なる形状の配列をどのように扱うかをしっかりと理解することができます。さまざまな配列構成をシームレスに処理できる堅牢で柔軟なPythonコードを書くための知識を身につけ、より複雑なデータ分析や科学計算タスクに取り組むことができるようになります。