Spaces:
Sleeping
Sleeping
from typing import Any | |
import numpy as np | |
class Histogram: | |
""" | |
Histogram data type for Trackio, compatible with wandb.Histogram. | |
Example: | |
```python | |
import trackio | |
import numpy as np | |
# Create histogram from sequence | |
data = np.random.randn(1000) | |
trackio.log({"distribution": trackio.Histogram(data)}) | |
# Create histogram from numpy histogram | |
hist, bins = np.histogram(data, bins=30) | |
trackio.log({"distribution": trackio.Histogram(np_histogram=(hist, bins))}) | |
# Specify custom number of bins | |
trackio.log({"distribution": trackio.Histogram(data, num_bins=50)}) | |
``` | |
Args: | |
sequence: Optional sequence of values to create histogram from | |
np_histogram: Optional pre-computed numpy histogram (hist, bins) tuple | |
num_bins: Number of bins for the histogram (default 64, max 512) | |
""" | |
TYPE = "trackio.histogram" | |
def __init__( | |
self, | |
sequence: Any = None, | |
np_histogram: tuple | None = None, | |
num_bins: int = 64, | |
): | |
if sequence is None and np_histogram is None: | |
raise ValueError("Must provide either sequence or np_histogram") | |
if sequence is not None and np_histogram is not None: | |
raise ValueError("Cannot provide both sequence and np_histogram") | |
num_bins = min(num_bins, 512) | |
if np_histogram is not None: | |
self.histogram, self.bins = np_histogram | |
self.histogram = np.asarray(self.histogram) | |
self.bins = np.asarray(self.bins) | |
else: | |
data = np.asarray(sequence).flatten() | |
data = data[np.isfinite(data)] | |
if len(data) == 0: | |
self.histogram = np.array([]) | |
self.bins = np.array([]) | |
else: | |
self.histogram, self.bins = np.histogram(data, bins=num_bins) | |
def _to_dict(self) -> dict: | |
"""Convert histogram to dictionary for storage.""" | |
return { | |
"_type": self.TYPE, | |
"bins": self.bins.tolist(), | |
"values": self.histogram.tolist(), | |
} | |