Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
from copy import deepcopy | |
import numpy as np | |
from functools import partial | |
from .f import memoize | |
def check_key_len(d, length): | |
for k, v in d.items(): | |
if len(v) != length: | |
raise ValueError(f"dictionary values are not all of length {length}. Found {len(v)}") | |
def check_zippable(dict_a, dict_b): | |
"""Check that the arrays contained in each value of dict_a and b are of identical length""" | |
avals = list(dict_a.values()) | |
bvals = list(dict_b.values()) | |
assert len(avals) > 0 | |
length = len(avals[0]) | |
check_key_len(dict_a, length) | |
check_key_len(dict_b, length) | |
def zip_dicts(dict_a, dict_b): | |
"""Zip the arrays associated with the keys in two dictionaries""" | |
combined = {} | |
combined.update(dict_a) | |
combined.update(dict_b) | |
zipped_vals = zip(*combined.values()) | |
keys = list(combined.keys()) | |
out = [] | |
for i, zv in enumerate(zipped_vals): | |
obj = {k: v_ for (k,v_) in zip(keys, zv)} | |
out.append(obj) | |
return out | |
def vround(ndigits): | |
"""Vectorized version of "round" that can be used on numpy arrays. Returns a function that can be used to round digits in a response""" | |
return np.vectorize(partial(round, ndigits=ndigits)) | |
def roundTo(arr, ndigits): | |
"""Round an array to ndigits""" | |
f = vround(ndigits) | |
return f(arr) | |
def map_nlist(f, nlist): | |
"""Map a function across an arbitrarily nested list""" | |
new_list=[] | |
for i in range(len(nlist)): | |
if isinstance(nlist[i],list): | |
new_list += [map_nlist(f, nlist[i])] | |
else: | |
new_list += [f(nlist[i])] | |
return new_list | |