ユニバーサル関数(ufunc)
np.sqrt、np.abs、np.exp、np.logなどの組み込み要素単位関数を、ループを書かずに配列へ適用します。
「ユニバーサル関数(ufunc)」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
ufuncとは
ユニバーサル関数(ufunc)は、配列のすべての要素に対して数学的な演算を一度に実行します。高速にコンパイルされたCで動作するため、Pythonのループよりはるかに高速です。⚡
import numpy as np
a = np.array([1.0, 4.0, 9.0, 16.0])
print(np.sqrt(a)) # [1. 2. 3. 4.]
# Equivalent Python loop would be hundreds of times slower数学のufunc:sqrt、exp、log
よく使う数学関数はすべてufuncです。np.sqrt、np.exp、np.logなどがあります。配列全体に一度に適用でき、特殊なケースも適切に処理します。
import numpy as np
a = np.array([0.0, 1.0, 2.0, 3.0])
print(np.exp(a)) # [1. 2.718 7.389 20.086]
print(np.log(np.exp(a))) # [0. 1. 2. 3.]
print(np.log2(np.array([1, 2, 4, 8]))) # [0. 1. 2. 3.]三角関数のufunc
NumPyのnp.sinやnp.cosなどの三角関数ufuncは、角度をラジアンで受け取ります。先にnp.deg2radを使って度を変換してください。
import numpy as np
angles = np.array([0, 30, 60, 90])
rad = np.deg2rad(angles)
print(np.sin(rad).round(4)) # [0. 0.5 0.866 1. ]
print(np.cos(rad).round(4)) # [1. 0.866 0.5 0. ]np.abs、np.floor、np.ceil、np.round
丸め処理には、np.floor(切り捨て)、np.ceil(切り上げ)、np.round(最近接値)を使います。配列全体の浮動小数点数を一度に整えられます。
import numpy as np
a = np.array([-2.7, 0.4, 1.5, 3.9])
print(np.abs(a)) # [2.7 0.4 1.5 3.9]
print(np.floor(a)) # [-3. 0. 1. 3.]
print(np.ceil(a)) # [-2. 1. 2. 4.]
print(np.round(a)) # [-3. 0. 2. 4.]np.maximumとnp.minimum
np.maximum(a, b)は、2つの配列の各位置で大きい方の値を取得します。1つの数値を返すnp.maxとは異なります。np.maximum(a, 0)はReLUです。
import numpy as np
a = np.array([-3, 1, 5, -2, 4])
b = np.array([0, 0, 3, 3, 3])
print(np.maximum(a, b)) # [0 1 5 3 4]
print(np.minimum(a, b)) # [-3 0 3 -2 3]
# ReLU
print(np.maximum(a, 0)) # [0 1 5 0 4]値の範囲を制限するnp.clip
np.clipは、すべての要素を指定した範囲内に収めます。下限より小さい値は下限まで引き上げ、上限より大きい値は上限まで引き下げます。値の範囲を制限するのに便利です。
import numpy as np
a = np.array([0.1, 0.5, -0.2, 1.3, 0.9])
clipped = np.clip(a, 0.0, 1.0)
print(clipped) # [0.1 0.5 0. 1. 0.9]多次元配列に対するufunc
ufuncはどのような形状の配列にも適用できます。各要素に個別に演算を行い、結果は同じ形状になります。形状を変更する必要はありません。
import numpy as np
m = np.array([[1.0, 4.0], [9.0, 16.0]])
print(np.sqrt(m))
# [[1. 2.]
# [3. 4.]]メモリ効率を高めるout引数
すべてのufuncはout=引数を受け取り、すでに用意した配列に結果を書き込めます。新しい配列の作成を省略できるため、メモリが厳しく制限されるループで便利です。
import numpy as np
a = np.array([1.0, 4.0, 9.0])
result = np.empty(3)
np.sqrt(a, out=result) # write directly into result
print(result) # [1. 2. 3.]np.add.reduceと.accumulate
各ufuncには、すべての要素をまとめる.reduce()メソッドがあります(np.add.reduceは単なる合計です)。.accumulate()を使うと累積値を計算できます。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.add.reduce(a)) # 15
print(np.add.accumulate(a)) # [ 1 3 6 10 15]
print(np.multiply.reduce(a)) # 120カスタムufuncに使うnp.frompyfunc
np.frompyfuncを使うと、任意のPython関数を配列に適用できるufuncに変換できます。組み込み関数より遅いため、簡単なプロトタイピングに使うとよいでしょう。
import numpy as np
def clamp_positive(x):
return x if x > 0 else 0.0
vfunc = np.frompyfunc(clamp_positive, 1, 1)
a = np.array([-2, 3, -1, 5])
print(vfunc(a)) # [0.0 3 0.0 5] (object dtype)ufuncとPythonループを比較する
速度差は非常に大きくなります。100万個の要素では、ufuncがPythonのループより約200倍高速になることがあります。数値処理では、まずufuncを使うようにしましょう。🚀
import numpy as np
import time
a = np.random.rand(1_000_000)
start = time.perf_counter()
np.sqrt(a)
print('ufunc:', round(time.perf_counter() - start, 4), 's')
start = time.perf_counter()
[x ** 0.5 for x in a]
print('loop:', round(time.perf_counter() - start, 4), 's')確認問題
このレッスンで学んだNumPyのufuncについて、理解度を確認しましょう。
レッスンのまとめ
よくできました!ufuncは高速なCで要素ごとの演算を行い、sqrt、exp、log、三角関数などに対応します。また、out=引数を使うとメモリを節約できます。次は集約関数です。
よくある質問
「ユニバーサル関数(ufunc)」レッスンは無料ですか?
はい。「ユニバーサル関数(ufunc)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「ユニバーサル関数(ufunc)」で何を学びますか?
np.sqrt、np.abs、np.exp、np.logなどの組み込み要素単位関数を、ループを書かずに配列へ適用します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ユニバーサル関数(ufunc)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ユニバーサル関数(ufunc)
- 集約関数
- ブロードキャストの規則
- ブールマスキングとFancy Indexing