"""Utility functions for arrays and the like."""
import numpy as np
import scipy.sparse
import probnum
__all__ = [
"atleast_1d",
"atleast_2d",
"as_colvec",
"assert_is_1d_ndarray",
"assert_is_2d_ndarray",
]
[docs]def atleast_1d(*rvs):
"""
Convert arrays or random variables to arrays or random variables
with at least one dimension.
Scalar inputs are converted to 1-dimensional arrays, whilst
higher-dimensional inputs are preserved. Sparse arrays are not
transformed.
Parameters
----------
rvs: array-like or RandomVariable
One or more input random variables or arrays.
Returns
-------
res : array-like or list
An array / random variable or list of arrays / random variables,
each with ``a.ndim >= 1``.
See Also
--------
atleast_2d
"""
res = []
for rv in rvs:
if isinstance(rv, scipy.sparse.spmatrix):
result = rv
elif isinstance(rv, np.ndarray):
result = np.atleast_1d(rv)
elif isinstance(rv, probnum.RandomVariable):
raise NotImplementedError
else:
result = rv
res.append(result)
if len(res) == 1:
return res[0]
else:
return res
[docs]def atleast_2d(*rvs):
"""
View inputs as arrays with at least two dimensions.
Parameters
----------
arys1, arys2, ... : array-like or RandomVariable
One or more random variables or array-like sequences. Non-array
inputs are converted to arrays or random variables. Arrays or
random variables that already have two or more dimensions are
preserved.
Returns
-------
rvs: array-like or list
An array, random variable or a list of arrays / random
variables, each with ``a.ndim >= 2``.
See Also
--------
atleast_1d
"""
res = []
for rv in rvs:
if isinstance(rv, scipy.sparse.spmatrix):
result = rv
elif isinstance(rv, np.ndarray):
result = np.atleast_2d(rv)
elif isinstance(rv, probnum.RandomVariable):
raise NotImplementedError
else:
result = rv
res.append(result)
if len(res) == 1:
return res[0]
else:
return res
[docs]def as_colvec(vec):
"""
Transform the given vector or random variable to column format.
Given a vector (or random variable) of dimension (n,) return an array with
dimensions (n, 1) instead. Higher-dimensional arrays are not changed.
Parameters
----------
vec : np.ndarray or RandomVariable
Vector, array or random variable to be viewed as a column vector.
Returns
-------
vec2d : np.ndarray or RandomVariable
"""
if isinstance(vec, probnum.RandomVariable):
if vec.shape != (vec.shape[0], 1):
vec.reshape(newshape=(vec.shape[0], 1))
else:
if vec.ndim == 1:
return vec[:, None]
return vec
[docs]def assert_is_1d_ndarray(arr):
"""
Checks whether arr is an (d,) np.ndarray.
Used in classic optimization and mcmc, for instance.
"""
if not isinstance(arr, np.ndarray):
raise ValueError("Please enter arr of shape (d,)")
elif len(arr.shape) != 1:
raise ValueError("Please enter arr of shape (d,)")
[docs]def assert_is_2d_ndarray(arr):
"""
Checks whether ar is an (n, d) np.ndarray.
Used in classic optimization and mcmc, for instance.
"""
if not isinstance(arr, np.ndarray):
raise ValueError("Please enter arr of shape (n, d)")
elif arr.ndim != 2:
raise ValueError("Please enter arr of shape (n, d)")