0Pricing
Pandas & NumPy Academy · レッスン

ユニバーサル関数(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フィードバックを取得できます。ローカル設定は不要です。

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

  1. ユニバーサル関数(ufunc)
  2. 集約関数
  3. ブロードキャストの規則
  4. ブールマスキングとFancy Indexing
← Pandas & NumPy Academyに戻る