Universal functions, or ufuncs, are a core feature of NumPy. They are fast, element-wise operations implemented in compiled C code that provide high-performance function application over NumPy arrays. Ufuncs are used for a wide range of mathematical, logical, and bitwise operations.
This guide explores the depth and flexibility of ufuncs, including:
A ufunc is a function that operates on ndarrays in an element-by-element fashion, supporting array broadcasting, type casting, and many other standard features.
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
result = np.add(x, y)
print(result)
Functions like np.add(), np.multiply(), np.sin() are ufuncs. These are much faster than Python for-loops and support vectorization.
x = np.array([0, np.pi/2, np.pi])
print(np.sin(x))
print(np.sqrt([1, 4, 9]))
print(np.absolute([-1, -2, 3]))
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.add(a, b))
print(np.subtract(a, b))
print(np.multiply(a, b))
print(np.divide(a, b))
import time
arr = np.arange(1e6)
# Using list comprehension
start = time.time()
squared_list = [x**2 for x in arr]
print("List time:", time.time() - start)
# Using ufunc
start = time.time()
squared_ufunc = np.square(arr)
print("Ufunc time:", time.time() - start)
np.add(x, y)
np.subtract(x, y)
np.multiply(x, y)
np.divide(x, y)
np.floor_divide(x, y)
np.mod(x, y)
np.power(x, y)
x = np.array([0, np.pi/2, np.pi])
print(np.sin(x))
print(np.cos(x))
print(np.tan(x))
x = np.array([1, np.e, np.e**2])
print(np.exp([0, 1, 2]))
print(np.log(x))
print(np.log10(x))
print(np.log2(x))
x = np.array([1.2, 2.5, 3.7])
print(np.floor(x))
print(np.ceil(x))
print(np.rint(x))
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
print(np.greater(x, y))
print(np.less(x, y))
print(np.equal(x, y))
print(np.not_equal(x, y))
a = np.array([True, False, True])
b = np.array([False, False, True])
print(np.logical_and(a, b))
print(np.logical_or(a, b))
print(np.logical_not(a))
x = np.array([0, 1, 2])
y = np.array([2, 2, 2])
print(np.bitwise_and(x, y))
print(np.bitwise_or(x, y))
print(np.bitwise_xor(x, y))
a = np.array([1, 2, 3])
b = 2
print(np.multiply(a, b)) # Broadcast scalar to array
m = np.array([[1], [2], [3]])
n = np.array([10, 20, 30])
result = np.add(m, n)
print(result)
x = np.arange(1, 5)
print(np.add.reduce(x)) # 1 + 2 + 3 + 4
print(np.add.accumulate(x)) # [1, 3, 6, 10]
print(np.multiply.outer(x, x))
def custom_add(x, y):
return x + y + 1
ufunc = np.frompyfunc(custom_add, 2, 1)
result = ufunc([1, 2, 3], [4, 5, 6])
print(result)
vec_add = np.vectorize(lambda x, y: x + y + 1)
print(vec_add([1, 2], [3, 4]))
np.frompyfunc and np.vectorize create ufunc-like behavior in Python but are not as fast as built-in ufuncs since they operate in Python space.
print(np.add.types)
def add_str(x, y):
return str(x) + str(y)
vec = np.vectorize(add_str, otypes=[str])
print(vec([1, 2, 3], [4, 5, 6]))
x = np.arange(10)
print(np.add.reduceat(x, [0, 5, 7])) # sum from [0:5], [5:7], [7:]
x = np.array([1, 2, 3, 4, 5])
np.add.at(x, [0, 1, 1], [10, 20, 30])
print(x) # Modifies in-place
x = np.array([1, 2, 3])
y = np.array([4, 5])
print(np.subtract.outer(x, y))
from PIL import Image
img = Image.open("grayscale.jpg").convert("L")
arr = np.array(img)
thresholded = np.where(arr > 128, 255, 0)
Image.fromarray(thresholded.astype(np.uint8)).save("thresholded.jpg")
prices = np.array([100, 105, 103, 107])
returns = np.divide(np.diff(prices), prices[:-1])
print(returns)
data = np.random.rand(1000)
standardized = (data - np.mean(data)) / np.std(data)
print(standardized[:5])
Universal functions are one of the most powerful features of NumPy. They combine performance, convenience, and flexibility, making them indispensable for numerical computing. With support for broadcasting, advanced method chaining, and the ability to create custom functions, ufuncs provide a robust foundation for data analysis, scientific modeling, and high-performance applications.
By mastering ufuncs, you move beyond simple array manipulations and gain the ability to write concise, readable, and fast numerical Python code.
Python is commonly used for developing websites and software, task automation, data analysis, and data visualisation. Since it's relatively easy to learn, Python has been adopted by many non-programmers, such as accountants and scientists, for a variety of everyday tasks, like organising finances.
Learning Curve: Python is generally considered easier to learn for beginners due to its simplicity, while Java is more complex but provides a deeper understanding of how programming works.
The point is that Java is more complicated to learn than Python. It doesn't matter the order. You will have to do some things in Java that you don't in Python. The general programming skills you learn from using either language will transfer to another.
Read on for tips on how to maximize your learning. In general, it takes around two to six months to learn the fundamentals of Python. But you can learn enough to write your first short program in a matter of minutes. Developing mastery of Python's vast array of libraries can take months or years.
6 Top Tips for Learning Python
The following is a step-by-step guide for beginners interested in learning Python using Windows.
Best YouTube Channels to Learn Python
Write your first Python programStart by writing a simple Python program, such as a classic "Hello, World!" script. This process will help you understand the syntax and structure of Python code.
The average salary for Python Developer is ₹5,55,000 per year in the India. The average additional cash compensation for a Python Developer is within a range from ₹3,000 - ₹1,20,000.
Copyrights © 2024 letsupdateskills All rights reserved