Source code for bayesflow.adapters.transforms.to_array
from numbers import Number
import numpy as np
from keras.saving import register_keras_serializable as serializable
from bayesflow.utils.io import deserialize_type, serialize_type
from .elementwise_transform import ElementwiseTransform
[docs]
@serializable(package="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):
super().__init__()
self.original_type = None
[docs]
@classmethod
def from_config(cls, config: dict, custom_objects=None) -> "ToArray":
instance = cls()
instance.original_type = deserialize_type(config["original_type"])
return instance
[docs]
def get_config(self) -> dict:
return {"original_type": serialize_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