Source code for pinnx.utils.array_ops

# Rewrite of the original file in DeepXDE: https://github.com/lululxvi/deepxde
# ==============================================================================


from typing import Sequence

import brainstate
import brainunit as u
import jax
import numpy as np


[docs] def is_tensor(obj): return isinstance(obj, (jax.Array, u.Quantity, np.ndarray))
[docs] def istensorlist(values): return any(map(is_tensor, values))
[docs] def convert_to_array(value: Sequence): """Convert a list of numpy arrays or tensors to a numpy array or a tensor.""" if istensorlist(value): return np.stack(value, axis=0) return np.array(value, dtype=brainstate.environ.dftype())
[docs] def hstack(tup): if not is_tensor(tup[0]) and isinstance(tup[0], list) and tup[0] == []: tup = list(tup) if istensorlist(tup[1:]): tup[0] = np.asarray([], dtype=brainstate.environ.dftype()) else: tup[0] = np.array([], dtype=brainstate.environ.dftype()) return np.concatenate(tup, 0) if is_tensor(tup[0]) else np.hstack(tup)
[docs] def zero_padding(array, pad_width): # SparseTensor if isinstance(array, (list, tuple)) and len(array) == 3: indices, values, dense_shape = array indices = [(i + pad_width[0][0], j + pad_width[1][0]) for i, j in indices] dense_shape = ( dense_shape[0] + sum(pad_width[0]), dense_shape[1] + sum(pad_width[1]), ) return indices, values, dense_shape return np.pad(array, pad_width)