SciPy (Scientific Python) is a collection of mathematical algorithms and convenience functions built on NumPy. It provides advanced capabilities for optimization, linear algebra, integration, interpolation, and other domains.
- Overview
- Core Features and Submodules
- scipy.optimize – Optimization and Root Finding
- scipy.integrate – Integration
- scipy.interpolate – Interpolation
- scipy.linalg – Linear Algebra
- scipy.stats – Statistical Functions
- scipy.signal – Signal Processing
- scipy.spatial – Spatial Algorithms and Data Structures
- scipy.fft – Fast Fourier Transforms
- scipy.ndimage – Multidimensional Image Processing
- scipy.sparse – Sparse Matrix Support
- Practical Examples
- Best Practices
Used for finding minima/maxima of functions and solving equations.
from scipy import optimize
import numpy as np
# Example: Finding minimum of a function
def f(x):
return x**2 + 10*np.sin(x)
result = optimize.minimize(f, x0=0) # Start search at x=0
print(f"Minimum found at x = {result.x}")
Provides tools for numerical integration.
from scipy import integrate
# Example: Definite integral of sin(x) from 0 to pi
def integrand(x):
return np.sin(x)
result, error = integrate.quad(integrand, 0, np.pi)
print(f"Integral = {result:.6f}, Error = {error:.6f}")
Creates functions based on discrete data points.
from scipy import interpolate
# Example: Creating smooth curve through points
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([0, 2, 1, 3, 7, 4])
# Create interpolation function
f = interpolate.interp1d(x, y, kind='cubic')
# Generate smooth curve
x_new = np.linspace(0, 5, 100)
y_new = f(x_new)
Advanced linear algebra operations.
from scipy import linalg
# Example: Solving system of linear equations
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])
x = linalg.solve(A, b)
print(f"Solution: {x}")
# Computing eigenvalues
eigenvals = linalg.eigvals(A)
print(f"Eigenvalues: {eigenvals}")
Comprehensive collection of probability distributions and statistical functions.
from scipy import stats
# Example: Generating normal distribution and calculating statistics
data = stats.norm.rvs(loc=0, scale=1, size=1000)
ks_statistic, p_value = stats.kstest(data, 'norm')
print(f"KS test p-value: {p_value}")
# Performing t-test
sample1 = stats.norm.rvs(loc=0, scale=1, size=100)
sample2 = stats.norm.rvs(loc=0.5, scale=1, size=100)
t_stat, p_val = stats.ttest_ind(sample1, sample2)
Tools for signal processing.
from scipy import signal
# Example: Creating and applying a filter
t = np.linspace(0, 1, 1000)
raw_signal = np.sin(2*np.pi*10*t) + np.random.normal(0, 0.1, len(t))
# Design filter
b, a = signal.butter(4, 0.2) # 4th order Butterworth filter
filtered_signal = signal.filtfilt(b, a, raw_signal)
from scipy.spatial import KDTree, ConvexHull
import numpy as np
# KD-Tree example for nearest-neighbor search
points = np.random.rand(10, 2)
tree = KDTree(points)
dist, idx = tree.query([0.5, 0.5])
print(f"Nearest point: {points[idx]}, Distance: {dist}")
# Convex Hull example
hull = ConvexHull(points)
print("Convex hull vertices:", hull.vertices)
Use cases: Nearest-neighbor searches, computational geometry (e.g. convex hulls, Delaunay triangulations).
from scipy.fft import fft, fftfreq
import numpy as np
# FFT of a simple signal
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
yf = fft(y)
xf = fftfreq(len(x), (x[1] - x[0]))
print("FFT frequencies:", xf)
print("FFT values:", np.abs(yf))
Use cases: Signal processing, spectral analysis, filtering.
from scipy import ndimage
import numpy as np
# Apply Gaussian blur to an image (2D array)
image = np.random.rand(100, 100)
blurred = ndimage.gaussian_filter(image, sigma=3)
print("Blurred image shape:", blurred.shape)
Use cases: Image filtering, transformations, feature detection (e.g. edge detection, measurements).
from scipy.sparse import csr_matrix
# Create a sparse matrix
dense = np.array([[0, 0, 3], [4, 0, 0], [0, 0, 5]])
sparse = csr_matrix(dense)
print("Sparse matrix representation:\n", sparse)
print("Back to dense:\n", sparse.toarray())
Use cases: Efficient storage and computation with large, mostly-zero matrices (e.g. graph adjacency matrices, linear algebra).
from scipy import optimize
# Generate sample data with noise
x_data = np.linspace(0, 10, 20)
y_data = 3 * np.exp(-x_data/2) + np.random.normal(0, 0.1, len(x_data))
# Define model function
def model(x, a, b):
return a * np.exp(-b * x)
# Fit model to data
popt, pcov = optimize.curve_fit(model, x_data, y_data)
print(f"Fitted parameters: a={popt[0]:.2f}, b={popt[1]:.2f}")
from scipy import optimize
# Define equation: x^3 - 2x^2 + 4x - 8 = 0
def equation(x):
return x**3 - 2*x**2 + 4*x - 8
# Find root using different methods
root1 = optimize.newton(equation, x0=0) # Newton's method
root2 = optimize.bisect(equation, 0, 5) # Bisection method
print(f"Root (Newton): {root1:.4f}")
print(f"Root (Bisect): {root2:.4f}")
from scipy import stats
# Generate two samples
group1 = stats.norm.rvs(loc=10, scale=2, size=100)
group2 = stats.norm.rvs(loc=12, scale=2, size=100)
# Perform statistical tests
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"T-test p-value: {p_value}")
# Calculate confidence interval
confidence_interval = stats.t.interval(0.95, len(group1)-1,
loc=np.mean(group1),
scale=stats.sem(group1))
- Always import NumPy alongside SciPy:
import numpy as np
from scipy import [submodule]
- Use specific imports for better code readability:
from scipy.optimize import minimize # Better than scipy.optimize.minimize
- Handle errors and convergence:
try:
result = optimize.minimize(f, x0=0)
if result.success:
print(f"Optimization successful: {result.x}")
else:
print(f"Optimization failed: {result.message}")
except Exception as e:
print(f"Error occurred: {e}")
- Set random seeds for reproducibility:
np.random.seed(42)
data = stats.norm.rvs(size=1000)
- Additional examples for reproducibility in motion and video synthesis:
- Motion Synthesis:
import numpy as np
from scipy.interpolate import interp1d
np.random.seed(42) # Seed for reproducible motion
keyframes = {0: np.random.rand(2), 30: np.random.rand(2), 60: np.random.rand(2)}
time_points = np.array(list(keyframes.keys()))
positions = np.array(list(keyframes.values()))
motion_interp = interp1d(time_points, positions.T, kind='cubic')
- Video Frame Generation:
np.random.seed(123)
frames = [np.random.normal(size=(64, 64)) for _ in range(10)]
- Noise Generation for Video Effects:
np.random.seed(456)
video_noise = np.random.normal(0, 0.1, size=(30, 1920, 1080))
- Particle Animation:
np.random.seed(789)
particle_positions = np.random.rand(100, 2)
particle_velocities = np.random.randn(100, 2) * 0.1
- Color Palette Generation:
np.random.seed(101)
color_palette = np.random.randint(0, 255, size=(10, 3))
- Camera Shake Simulation:
np.random.seed(202)
camera_motion = np.random.normal(0, 0.5, size=(60, 2))
- Transition Effects:
np.random.seed(303)
transition_curve = np.random.beta(2, 2, size=30)
- Audio Synthesis:
np.random.seed(404)
audio_samples = np.random.uniform(-1, 1, size=44100)
Created by Volkan Sah