From 137a5f7995fe50804b3172e399794ce0140387d4 Mon Sep 17 00:00:00 2001 From: Jim Date: Sat, 11 Mar 2023 07:40:27 -0500 Subject: [PATCH 1/2] improve random_sample() --- py5_resources/py5_module/py5/mixins/math.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/py5_resources/py5_module/py5/mixins/math.py b/py5_resources/py5_module/py5/mixins/math.py index 8ba772b6..59490f33 100644 --- a/py5_resources/py5_module/py5/mixins/math.py +++ b/py5_resources/py5_module/py5/mixins/math.py @@ -22,6 +22,7 @@ import warnings import traceback from pathlib import Path +import types from typing import overload, Union, Any import numpy as np @@ -261,17 +262,25 @@ def random_int(self, *args: int) -> int: def random_choice(self, objects: list[Any]) -> Any: """$class_Sketch_random_choice""" - if objects: + if len(objects): return objects[self._rng.integers(0, len(objects))] else: return None - def random_sample(self, objects: list[Any], size: int=1, replace: bool=True) -> npt.NDArray: + def random_sample(self, objects: list[Any], size: int=1, replace: bool=True) -> list[Any]: """$class_Sketch_random_sample""" - if objects: - return self._rng.choice(objects, size=size, replace=replace) + if len(objects): + if isinstance(objects, types.GeneratorType): + objects = list(objects) + indices = self._rng.choice(range(len(objects)), size=size, replace=replace) + if not isinstance(objects, list): + try: + return objects[indices] + except: + pass + return [objects[idx] for idx in indices] else: - return np.array([], dtype='O') + return [] @overload def random_gaussian(self) -> float: From cbe912ce8cb308e91e051035e3dbf6d27bd2da5e Mon Sep 17 00:00:00 2001 From: Jim Date: Sat, 11 Mar 2023 07:40:39 -0500 Subject: [PATCH 2/2] update docs for changes --- py5_docs/Reference/api_en/Sketch_random_sample.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py5_docs/Reference/api_en/Sketch_random_sample.txt b/py5_docs/Reference/api_en/Sketch_random_sample.txt index 7e8665ae..fa5775f1 100644 --- a/py5_docs/Reference/api_en/Sketch_random_sample.txt +++ b/py5_docs/Reference/api_en/Sketch_random_sample.txt @@ -5,7 +5,7 @@ category = math subcategory = random @@ signatures -random_sample(objects: list[Any], size: int=1, replace: bool=True) -> npt.NDArray +random_sample(objects: list[Any], size: int=1, replace: bool=True) -> list[Any] @@ variables objects: list[Any] - list of objects to choose from @@ -15,7 +15,7 @@ size: int=1 - number of random items to select @@ description Select random items from a list. The list items can be of any type. If multiple items are selected, this function will by default allow the same item to be selected multiple times. Set the `replace` parameter to `False` to prevent the same item from being selected multiple times. -The returned value will always be a numpy array, even if only one item is sampled. If the list of objects is empty, an empty numpy array will be returned. +The returned value will always be a sequence such as a list or numpy array, even if only one item is sampled. If you only want to sample one item, consider using [](sketch_random_choice) instead. If the list of objects is empty, an empty list will be returned. This function's randomness can be influenced by [](sketch_random_seed), and makes calls to numpy to select the random items.