Source code for bayesflow.adapters.transforms.to_array
from numbers import Number
import numpy as np
from bayesflow.utils.serialization import serializable, serialize
from .elementwise_transform import ElementwiseTransform
[docs]
@serializable("bayesflow.adapters")
class ToArray(ElementwiseTransform):
"""
Checks provided data for any non-arrays and converts them to numpy arrays.
This ensures all data is in a format suitable for training.
Examples
--------
>>> ta = bf.adapters.transforms.ToArray()
>>> a = [1, 2, 3, 4]
>>> ta.forward(a)
array([1, 2, 3, 4])
>>> b = [[1, 2], [3, 4]]
>>> ta.forward(b)
array([[1, 2],
[3, 4]])
"""
def __init__(self, original_type: type = None):
super().__init__()
self.original_type = original_type
[docs]
def get_config(self) -> dict:
return serialize({"original_type": self.original_type})
[docs]
def forward(self, data: any, **kwargs) -> np.ndarray:
if self.original_type is None:
self.original_type = type(data)
return np.asarray(data)
[docs]
def inverse(self, data: np.ndarray, **kwargs) -> any:
if self.original_type is None:
raise RuntimeError("Cannot call `inverse` before calling `forward` at least once.")
if issubclass(self.original_type, Number):
try:
return self.original_type(data.item())
except ValueError:
pass
# cannot invert
return data