4.0 KiB
Universal functions (ufunc)
A ufunc
, short for "universal function
," is a fundamental concept in NumPy, a powerful library for numerical computing in Python. Universal functions are highly optimized, element-wise functions designed to perform operations on data stored in NumPy arrays.
Uses of Ufuncs in NumPy
Universal functions (ufuncs) in NumPy provide a wide range of functionalities for efficient and powerful numerical computations. Below is a detailed explanation of their uses:
1. Element-wise Operations
Ufuncs perform operations on each element of the arrays independently.
import numpy as np
A = np.array([1, 2, 3, 4])
B = np.array([5, 6, 7, 8])
# Element-wise addition
np.add(A, B) # Output: array([ 6, 8, 10, 12])
2. Broadcasting
Ufuncs support broadcasting, allowing operations on arrays with different shapes, making it possible to perform operations without explicitly reshaping arrays.
C = np.array([1, 2, 3])
D = np.array([[1], [2], [3]])
# Broadcasting addition
np.add(C, D) # Output: array([[2, 3, 4], [3, 4, 5], [4, 5, 6]])
3. Vectorization
Ufuncs are vectorized, meaning they are implemented in low-level C code, allowing for fast execution and avoiding the overhead of Python loops.
# Vectorized square root
np.sqrt(A) # Output: array([1., 1.41421356, 1.73205081, 2.])
4. Type Flexibility
Ufuncs handle various data types and perform automatic type casting as needed.
E = np.array([1.0, 2.0, 3.0])
F = np.array([4, 5, 6])
# Addition with type casting
np.add(E, F) # Output: array([5., 7., 9.])
5. Reduction Operations
Ufuncs support reduction operations, such as summing all elements of an array or finding the product of all elements.
# Summing all elements
np.add.reduce(A) # Output: 10
# Product of all elements
np.multiply.reduce(A) # Output: 24
6. Accumulation Operations
Ufuncs can perform accumulation operations, which keep a running tally of the computation.
# Cumulative sum
np.add.accumulate(A) # Output: array([ 1, 3, 6, 10])
7. Reduceat Operations
Ufuncs can perform segmented reductions using the reduceat
method, which applies the ufunc at specified intervals.
G = np.array([0, 1, 2, 3, 4, 5, 6, 7])
indices = [0, 2, 5]
np.add.reduceat(G, indices) # Output: array([ 1, 9, 18])
8. Outer Product
Ufuncs can compute the outer product of two arrays, producing a matrix where each element is the result of applying the ufunc to each pair of elements from the input arrays.
# Outer product
np.multiply.outer([1, 2, 3], [4, 5, 6])
# Output: array([[ 4, 5, 6],
# [ 8, 10, 12],
# [12, 15, 18]])
9. Out Parameter
Ufuncs can use the out
parameter to store results in a pre-allocated array, saving memory and improving performance.
result = np.empty_like(A)
np.multiply(A, B, out=result) # Output: array([ 5, 12, 21, 32])
Create Your Own Ufunc
You can create custom ufuncs for specific needs using np.frompyfunc or np.vectorize, allowing Python functions to behave like ufuncs.
Here, we are using frompyfunc()
which takes three argument:
- function - the name of the function.
- inputs - the number of input (arrays).
- outputs - the number of output arrays.
def my_add(x, y):
return x + y
my_add_ufunc = np.frompyfunc(my_add, 2, 1)
my_add_ufunc(A, B) # Output: array([ 6, 8, 10, 12], dtype=object)
Some Common Ufunc are
Here are some commonly used ufuncs in NumPy:
- Arithmetic:
np.add
,np.subtract
,np.multiply
,np.divide
- Trigonometric:
np.sin
,np.cos
,np.tan
- Exponential and Logarithmic:
np.exp
,np.log
,np.log10
- Comparison:
np.maximum
,np.minimum
,np.greater
,np.less
- Logical:
np.logical_and
,np.logical_or
,np.logical_not
For more such Ufunc, address to Universal functions (ufunc) — NumPy