NumPy Universal Functions (ufuncs)
What are ufuncs?
Section titled “What are ufuncs?”A ufunc (universal function) is a function that performs element-wise operations on data in ndarrays. Think of them as fast, vectorized wrappers around simple functions that would otherwise take one scalar in and return one scalar out.
Examples:
np.sqrt,np.exp,np.lognp.sin,np.cosnp.maximum,np.minimum
They are faster and cleaner than Python loops.
Example: sqrt
Section titled “Example: sqrt”import numpy as np
arr = np.array([1, 4, 9, 16])
print(np.sqrt(arr))Unary vs binary ufuncs
Section titled “Unary vs binary ufuncs”flowchart LR A["Unary ufunc
one array in"] --> B["np.sqrt, np.exp, np.log
-> transformed array"] C["Binary ufunc
two arrays in"] --> D["np.add, np.maximum
-> one combined array"] E["Rare: multi-output ufunc"] --> F["np.modf
-> (fractional, integer) arrays"]
np.sqrt and np.exp are unary ufuncs — they take one array. Functions like np.add or np.maximum are binary — they take two arrays and return one result.
Common math ufuncs
Section titled “Common math ufuncs”import numpy as np
x = np.array([1.0, 2.0, 3.0])
print(np.exp(x))
print(np.log(x))
print(np.log10(x))Trigonometric ufuncs
Section titled “Trigonometric ufuncs”import numpy as np
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles))
print(np.cos(angles))Comparison ufuncs
Section titled “Comparison ufuncs”import numpy as np
a = np.array([1, 10, 3])
b = np.array([2, 5, 4])
print(np.maximum(a, b))
print(np.minimum(a, b))A ufunc that returns two arrays
Section titled “A ufunc that returns two arrays”Most ufuncs return one array, but a few — like np.modf — return more than one. It splits a float array into fractional and whole-number parts:
import numpy as np
arr = np.array([4.5, -8.1, 2.25])
remainder, whole_part = np.modf(arr)
print("remainder:", remainder)
print("whole:", whole_part)Writing results into an existing array
Section titled “Writing results into an existing array”Ufuncs accept an optional out argument to write results in place instead of allocating a new array — handy for saving memory on large arrays.
import numpy as np
arr = np.array([1.0, 2.0, 3.0])
result = np.zeros_like(arr)
np.add(arr, 1, out=result)
print(result)Working with NaN values
Section titled “Working with NaN values”Some ufuncs have NaN-safe variants.
import numpy as np
arr = np.array([1.0, np.nan, 3.0])
print(np.nanmean(arr))
print(np.nansum(arr))Ufuncs + broadcasting
Section titled “Ufuncs + broadcasting”Ufuncs naturally work with broadcasting.
import numpy as np
mat = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sqrt(mat))Continue to: Stacking and Splitting Arrays to combine and break arrays along different axes.
🧪 Try It Yourself
Section titled “🧪 Try It Yourself”Exercise 1 – Apply a Unary ufunc
Section titled “Exercise 1 – Apply a Unary ufunc”Exercise 2 – A Binary ufunc
Section titled “Exercise 2 – A Binary ufunc”Exercise 3 – NaN-safe Aggregation
Section titled “Exercise 3 – NaN-safe Aggregation”pch.coffeeTagline
pch.coffeeCtapch.feedbackHeading
pch.feedbackSubheading