def to_torch(x: Union[Batch, dict, list, tuple, np.ndarray, torch.Tensor], dtype: Optional[torch.dtype] = None, device: Union[str, int, torch.device] = 'cpu' ) -> Union[Batch, dict, list, tuple, np.ndarray, torch.Tensor]: """Return an object without np.ndarray.""" if isinstance(x, torch.Tensor): if dtype is not None: x = x.type(dtype) x = x.to(device) elif isinstance(x, dict): for k, v in x.items(): x[k] = to_torch(v, dtype, device) elif isinstance(x, Batch): x.to_torch(dtype, device) elif isinstance(x, (np.number, np.bool_, Number)): x = to_torch(np.asanyarray(x), dtype, device) elif isinstance(x, (list, tuple)): try: x = to_torch(_parse_value(x), dtype, device) except TypeError: x = [to_torch(e, dtype, device) for e in x] else: # fallback x = np.asanyarray(x) if issubclass(x.dtype.type, (np.bool_, np.number)): x = torch.from_numpy(x).to(device) if dtype is not None: x = x.type(dtype) else: raise TypeError(f"object {x} cannot be converted to torch.") return x
def to_torch( x: Any, dtype: Optional[torch.dtype] = None, device: Union[str, int, torch.device] = "cpu", ) -> Union[Batch, torch.Tensor]: """Return an object without np.ndarray.""" if isinstance(x, np.ndarray) and issubclass( x.dtype.type, (np.bool_, np.number)): # most often case x = torch.from_numpy(x).to(device) # type: ignore if dtype is not None: x = x.type(dtype) return x elif isinstance(x, torch.Tensor): # second often case if dtype is not None: x = x.type(dtype) return x.to(device) # type: ignore elif isinstance(x, (np.number, np.bool_, Number)): return to_torch(np.asanyarray(x), dtype, device) elif isinstance(x, (dict, Batch)): x = Batch(x, copy=True) if isinstance(x, dict) else deepcopy(x) x.to_torch(dtype, device) return x elif isinstance(x, (list, tuple)): return to_torch(_parse_value(x), dtype, device) else: # fallback raise TypeError(f"object {x} cannot be converted to torch.")
def to_numpy( x: Union[Batch, dict, list, tuple, np.ndarray, torch.Tensor] ) -> Union[Batch, dict, list, tuple, np.ndarray, torch.Tensor]: """Return an object without torch.Tensor.""" if isinstance(x, torch.Tensor): # most often case x = x.detach().cpu().numpy() elif isinstance(x, np.ndarray): # second often case pass elif isinstance(x, (np.number, np.bool_, Number)): x = np.asanyarray(x) elif x is None: x = np.array(None, dtype=np.object) elif isinstance(x, Batch): x.to_numpy() elif isinstance(x, dict): for k, v in x.items(): x[k] = to_numpy(v) elif isinstance(x, (list, tuple)): try: x = to_numpy(_parse_value(x)) except TypeError: x = [to_numpy(e) for e in x] else: # fallback x = np.asanyarray(x) return x
def to_numpy(x: Any) -> Union[Batch, np.ndarray]: """Return an object without torch.Tensor.""" if isinstance(x, torch.Tensor): # most often case return x.detach().cpu().numpy() elif isinstance(x, np.ndarray): # second often case return x elif isinstance(x, (np.number, np.bool_, Number)): return np.asanyarray(x) elif x is None: return np.array(None, dtype=object) elif isinstance(x, (dict, Batch)): x = Batch(x) if isinstance(x, dict) else deepcopy(x) x.to_numpy() return x elif isinstance(x, (list, tuple)): return to_numpy(_parse_value(x)) else: # fallback return np.asanyarray(x)
def to_numpy(x: Union[ Batch, dict, list, tuple, np.ndarray, torch.Tensor]) -> Union[ Batch, dict, list, tuple, np.ndarray, torch.Tensor]: """Return an object without torch.Tensor.""" if isinstance(x, torch.Tensor): x = x.detach().cpu().numpy() elif isinstance(x, dict): for k, v in x.items(): x[k] = to_numpy(v) elif isinstance(x, Batch): x.to_numpy() elif isinstance(x, (list, tuple)): try: x = to_numpy(_parse_value(x)) except TypeError: x = [to_numpy(e) for e in x] else: # fallback x = np.asanyarray(x) return x