0Pricing
Python Academy · レッスン

配列演算とブロードキャスト

ベクトル化された算術演算を行い、ブロードキャストの規則を理解します。

「配列演算とブロードキャスト」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

ベクトル化された算術演算

NumPyはPythonのループを使わず、配列全体に対して要素単位で算術演算を適用します。処理は最適化されたCコードで実行されます。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)    # [5 7 9]
print(a * b)    # [4 10 18]
print(a ** 2)   # [1 4 9]

ユニバーサル関数(ufunc)

NumPyのufuncは、Cレベルの関数を要素単位で適用します。例としてnp.sqrt、np.exp、np.log、np.sinなどがあります。

import numpy as np

x = np.linspace(0, np.pi, 5)
print(np.sin(x))   # [0. 0.707 1. 0.707 0.]
print(np.exp([1.0, 2.0, 3.0]))   # [2.718 7.389 20.086]

縮約演算

np.sum、np.mean、np.max、np.min、np.stdを使うと、配列をスカラーまたはより低次元の配列に縮約できます。

import numpy as np

m = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(m))          # 21
print(np.sum(m, axis=0))  # [5 7 9]  — sum each column
print(np.sum(m, axis=1))  # [6 15]   — sum each row

ブロードキャストのルール

ブロードキャストは、データをコピーせずに小さい配列を大きい配列に合うよう拡張します。ルールは、次元を右からそろえ、サイズ1の次元を拡張することです。

import numpy as np

a = np.array([[1], [2], [3]])  # shape (3,1)
b = np.array([10, 20, 30])     # shape (3,)

print(a + b)
# [[11 21 31]
#  [12 22 32]
#  [13 23 33]]

スカラー演算のブロードキャスト

スカラーは配列のすべての要素にブロードキャストされます。

import numpy as np

arr = np.arange(6).reshape(2, 3)
print(arr + 10)
# [[10 11 12]
#  [13 14 15]]
print(arr * 0.5)
# [[0.  0.5 1. ]
#  [1.5 2.  2.5]]

比較演算とブール演算

比較演算はブール配列を生成します。&、|、~と組み合わせます(Pythonのand、or、notではありません)。

import numpy as np

arr = np.array([1, 5, 3, 8, 2])
print(arr > 3)           # [False  True False  True False]
print(arr[(arr > 2) & (arr < 7)])  # [5 3]

where()

np.where(condition, x, y)は、条件がTrueの位置ではxの要素を、Falseの位置ではyの要素を返します。

import numpy as np

arr = np.array([-2, 3, -1, 4, 0])
result = np.where(arr >= 0, arr, 0)  # clip negatives to 0
print(result)   # [0 3 0 4 0]

軸に沿った集約

axis=を指定すると、多次元配列の特定の次元に沿って縮約できます。

import numpy as np

data = np.arange(12).reshape(3, 4)
print(data.mean(axis=0))   # mean of each column → shape (4,)
print(data.mean(axis=1))   # mean of each row → shape (3,)

cumsumとdiff

np.cumsumは累積和を計算し、np.diffは連続する要素間の差分を計算します。

import numpy as np

prices = np.array([100, 110, 105, 115])
print(np.cumsum(prices))          # [100 210 315 430]
print(np.diff(prices))            # [10 -5 10] (daily changes)

ベクトル化された文字列操作

np.charは、文字列配列に対するベクトル化された文字列操作を提供します。

import numpy as np

words = np.array(["apple", "banana", "cherry"])
print(np.char.upper(words))       # ['APPLE' 'BANANA' 'CHERRY']
print(np.char.startswith(words, "a"))  # [True False False]

Pythonリストとの性能比較

数値処理では、NumPyは同等のPythonループより10~100倍高速です。PythonインタープリターのオーバーヘッドなしにCで実行されるためです。

import numpy as np, time

n = 1_000_000

start = time.perf_counter()
python_sum = sum(i**2 for i in range(n))
print(f"Python: {time.perf_counter()-start:.3f}s")

arr = np.arange(n)
start = time.perf_counter()
numpy_sum = (arr**2).sum()
print(f"NumPy:  {time.perf_counter()-start:.3f}s")

確認問題

Shapeが(3,1)の配列にShapeが(3,)の配列を加算すると、結果のShapeはどうなりますか。

まとめ

NumPyの演算はPythonのループを使わず、Cで要素単位に実行されます。ブロードキャストは互換性のあるShapeをコピーせずに拡張します。特定の次元に沿って縮約するにはaxis=を使います。ufunc(np.sin、np.expなど)はCの速度で要素単位の演算を適用します。

よくある質問

「配列演算とブロードキャスト」レッスンは無料ですか?

はい。「配列演算とブロードキャスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「配列演算とブロードキャスト」で何を学びますか?

ベクトル化された算術演算を行い、ブロードキャストの規則を理解します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「配列演算とブロードキャスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. NumPy 配列と dtype
  2. 配列演算とブロードキャスト
  3. インデックス指定、スライス、高度なインデックス指定
  4. NumPy による線形代数
← Python Academyに戻る