histogram-test-208105 / histogram.py
abidlabs's picture
abidlabs HF Staff
Upload folder using huggingface_hub
82b0cb3 verified
raw
history blame
2.15 kB
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(),
}