| name | pylops |
| description | Linear operators for large-scale inverse problems with matrix-free representations.
Use when Claude needs to: (1) Define linear operators for forward/adjoint operations,
(2) Solve inverse problems (deconvolution, imaging, tomography), (3) Apply signal
processing transforms (FFT, convolution, derivatives), (4) Compose operators for
complex workflows, (5) Perform regularized inversion with smoothness or sparsity
constraints, (6) Process seismic or image data at scale.
|
| version | 1.0.0 |
| author | Geoscience Skills |
| license | MIT |
| tags | ["Linear Operators","Inverse Problems","Deconvolution","Signal Processing"] |
| dependencies | ["pylops>=2.0.0","numpy","scipy"] |
| complements | ["devito","simpeg","segyio"] |
| workflow_role | modelling |
PyLops - Linear Operators Library
Quick Reference
import numpy as np
import pylops
A = pylops.FirstDerivative(n=100, dtype='float64')
y = A @ x
x_adj = A.H @ y
x_est = A / y
Key Classes
| Class | Purpose |
|---|
LinearOperator | Base class for all operators |
VStack/HStack | Vertical/horizontal operator stacking |
BlockDiag | Block diagonal operator composition |
Essential Operations
Basic Operators
D = pylops.Diagonal(np.array([1., 2., 3.]))
y = D @ x; x_adj = D.H @ y
D1 = pylops.FirstDerivative(n, dtype='float64')
D2 = pylops.SecondDerivative(n, dtype='float64')
G = pylops.Gradient(dims=(64, 64), dtype='float64')
Convolution
wavelet = np.sin(np.linspace(0, 2*np.pi, 21)) * np.hanning(21)
C = pylops.signalprocessing.Convolve1D(n, h=wavelet, offset=10)
y = C @ x
x_adj = C.H @ y
Compose and Stack Operators
composed = pylops.Smoothing1D(5, n) @ pylops.FirstDerivative(n) @ pylops.Identity(n)
V = pylops.VStack([A, B])
H = pylops.HStack([A, B])
BD = pylops.BlockDiag([A, B])
Solve Inverse Problems
x_est = A / y
x_est = pylops.optimization.leastsquares.NormalEquationsInversion(A, None, y)
Reg = pylops.SecondDerivative(n)
x_est = pylops.optimization.leastsquares.RegularizedInversion(
A, [Reg], y, epsRs=[0.1]
)
Iterative Solvers
x_lsqr = pylops.optimization.solver.lsqr(A, y, iter_lim=100)[0]
x_cgls = pylops.optimization.solver.cgls(A, y, niter=100)[0]
Sparsity-Promoting Inversion
x_l1 = pylops.optimization.sparsity.fista(A, y, niter=100, eps=0.1)[0]
Verify Adjoint (Dot Test)
A = pylops.FirstDerivative(100)
pylops.utils.dottest(A, 100, 100, verb=True)
Common Patterns
Seismic Deconvolution
C = pylops.signalprocessing.Convolve1D(n, h=wavelet, offset=len(wavelet)//2)
seismic = C @ reflectivity
Reg = pylops.SecondDerivative(n)
reflectivity_est = pylops.optimization.leastsquares.RegularizedInversion(
C, [Reg], seismic, epsRs=[0.01]
)
Image Denoising with TV
ny, nx = image.shape
G = pylops.Gradient(dims=(ny, nx))
x_tv = pylops.optimization.sparsity.splitbregman(
pylops.Identity(ny*nx), G, image.ravel(),
niter_inner=5, niter_outer=10, mu=1.0, epsRL1s=[0.1]
)[0].reshape(ny, nx)
When to Use vs Alternatives
| Scenario | Recommendation |
|---|
| Matrix-free linear operators for large inverse problems | PyLops - purpose-built, memory efficient |
| Sparse matrix operations with known structure | scipy.sparse - standard, well-documented |
| Simple convolution/deconvolution | PyLops - clean API with Convolve1D |
| Custom operators for small problems | Custom NumPy/SciPy - no extra dependency |
| GPU-accelerated linear algebra | PyLops - pass CuPy arrays for automatic GPU |
| Seismic deconvolution or imaging operators | PyLops - rich signal processing operator library |
Choose PyLops when: You need matrix-free linear operators that scale to large problems
without forming explicit matrices. Its operator algebra (@, VStack, BlockDiag) and
built-in solvers (LSQR, FISTA, Split Bregman) make inverse problem workflows concise.
Avoid PyLops when: Your problem is small enough for explicit matrices (use NumPy/SciPy),
or you need nonlinear operators (PyLops is strictly linear).
Common Workflows
Regularized seismic deconvolution
Tips
- Never form full matrix - Use
.matvec() and .rmatvec() for memory efficiency
- Check shapes - Operators have
.shape attribute like matrices
- Verify adjoint - Always run
pylops.utils.dottest() for custom operators
- Start simple - Test on small problems before scaling up
- Use GPU - Pass CuPy arrays for automatic GPU acceleration
References
Scripts