Source code for draugr.python_utilities.generators.recycling_generator
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
from typing import Any, Iterable, Sequence
import numpy
__author__ = "Christian Heider Nielsen"
__doc__ = r"""
Created on 28/10/2019
"""
__all__ = ["recycle", "batched_recycle"]
[docs]def recycle(iterable: Iterable) -> Any:
"""
loops an iterable like itertools.cycle, but in a random order (Permutation) everytime the iterable is
exhausted
:param iterable:
:return:"""
if not isinstance(iterable, Sequence):
iterable = list(iterable)
while True:
for element in random.sample(iterable, len(iterable)):
yield element
[docs]def batched_recycle(sized: Sequence, batch_size: int = 32) -> Any:
"""Batches and re-cycles an array with a different permutation"""
if isinstance(sized, numpy.ndarray):
while True:
yield sized[numpy.random.choice(sized.shape[0], batch_size, replace=False)]
else:
if not isinstance(sized, Sequence):
sized = [*sized]
while True:
yield random.sample(sized, batch_size)
if __name__ == "__main__":
a = [0, 1.0, 3.0, 2.2]
for b in zip(range(3), batched_recycle(a, 2)):
print(b)
for b in zip(range(9), recycle(a)):
print(b)