UniBioTransfer / my_py_lib /misc_util.py
scy639's picture
Upload folder using huggingface_hub
2b534de verified
import os,time
import numpy as np
from pathlib import Path
class ch_cwd_to_this_file:
def __init__(self, _code_file_path): # _code_file_path typically receives __file__
self._code_file_path = _code_file_path
def __enter__(self):
self._old_dir = os.getcwd()
cwd=os.path.dirname(os.path.abspath(self._code_file_path))
os.chdir(cwd)
def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self._old_dir)
# def img_2_img_full_path(img,format='jpg',original_name_or_path=''):
# """
# thread safe
# """
# assert isinstance(img,np.ndarray)
# assert img.shape[2]==3 or img.shape[2]==4
# original_img_name_without_dir=os.path.basename(original_name_or_path)
# full_path = os.path.join(root_config.path_root, f'./tmp_images/[{root_config.DATASET}][{tmp_cate_or_obj}][{sequence_name}]{img_name_without_suffix}.jpg')
# if not os.path.exists(os.path.dirname(full_path)):
# os.makedirs(os.path.dirname(full_path))
# print("get_data path:", full_path)
# img.save(full_path)
# return img_full_path
import datetime
import pytz
def beijing_datetime()->datetime.datetime:
"""
Example: print(f'Current Beijing time = {beijing_time:%Y.%m.%d %H:%M:%S}')
"""
# get the local timezone
local_tz = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
# get Beijing timezone
beijing_tz = pytz.timezone('Asia/Shanghai')
# get the current time
now = datetime.datetime.now()
# convert current time to local timezone
local_time = now.astimezone(local_tz)
# convert local time to Beijing timezone
beijing_time:datetime.datetime = local_time.astimezone(beijing_tz)
return beijing_time
def beijing_str_A( os_is_windows=False)->str:
"""
print( beijing_str_A() )
"""
ret= f"{beijing_datetime():%m.%d-%H:%M:%S}"
if os_is_windows:
ret=ret.replace(':',':')
return ret
# convert numpy or tensor to json/dict
import json
import numpy
import PIL
import torch
from torch import Tensor
def to_list_to_primitive(obj):
if isinstance(obj, numpy.ndarray):
return obj.tolist()
if isinstance(obj, torch.Tensor):
return obj.cpu().data.numpy().tolist()
if isinstance(obj, list):
return [to_list_to_primitive(i) for i in obj]
# if isinstance(obj, DataFrame):
# return obj.values.tolist()
elif (isinstance(obj, numpy.int32) or
isinstance(obj, numpy.int64) or
isinstance(obj, numpy.float32) or
isinstance(obj, numpy.float64)):
return obj.item()
elif (isinstance(obj, int) or
isinstance(obj, float)
):
return obj
else:
raise TypeError("got {}".format(type(obj)))
def to_ndarray(x):
if isinstance(x, numpy.ndarray):
return x
if isinstance(x, torch.Tensor):
return x.cpu().data.numpy()
if isinstance(x, list):
return numpy.array(x)
if isinstance(x, PIL.Image.Image):
return numpy.array(x)
# if isinstance(x, int) or isinstance(x, float):
# return numpy.array([x])
raise TypeError("got {}".format(type(x)))
def to_tensor(x):
if isinstance(x, numpy.ndarray):
return torch.from_numpy(x)
if isinstance(x, torch.Tensor):
return x
if isinstance(x, PIL.Image.Image):
return torch.from_numpy(numpy.array(x))
if isinstance(x, list):
return torch.tensor(x)
# if isinstance(x, int) or isinstance(x, float):
# return torch.tensor([x])
raise TypeError("got {}".format(type(x)))
def to_pil(x):
import torch
if isinstance(x, PIL.Image.Image):
return x
if isinstance(x, numpy.ndarray):
return PIL.Image.fromarray(x)
if isinstance(x, torch.Tensor):
return PIL.Image.fromarray(x.cpu().data.numpy())
raise TypeError("got {}".format(type(x)))
class myJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, numpy.ndarray):
return obj.tolist()
if isinstance(obj, Tensor):
return obj.cpu().data.numpy().tolist()
elif (isinstance(obj, numpy.int32) or
isinstance(obj, numpy.int64) or
isinstance(obj, numpy.float32) or
isinstance(obj, numpy.float64)):
return obj.item()
elif isinstance(obj,Path):
return str(obj)
return json.JSONEncoder.default(self, obj)
if(__name__=="__main__"):
import torch
dic = {'x': torch.randn(2, 3), 'rec': numpy.array([[11, 22, 33], [44, 55, 66], [77, 88, 99]])}
s_dic=json.dumps(dic , cls=myJSONEncoder,
sort_keys=True, indent=2,
separators=(',', ': '), ensure_ascii=False)
with open('test.json', 'w', encoding='utf8') as f:
json.dump(dic,f,
# sort_keys=True,
sort_keys=False,
indent=2, separators=(',', ': '), ensure_ascii=False)
def truncate_str(string:str,MAX_LEN:int,suffix_if_truncate="......")->str:
assert isinstance(string,str)
if len(string)> MAX_LEN:
string=string[:MAX_LEN]+suffix_if_truncate
return string
def map_string_to_int(string,MIN,MAX):
"""
Map strings evenly into [MIN, MAX]
"""
assert isinstance(MIN,int)
assert isinstance(MAX,int)
assert MAX-MIN>=2
# compute ASCII sum
sum = 0
for char in string:
sum += ord(char)
# print("sum", sum)
ret=2**sum
ret += sum # avoid producing only powers of two
ret=ret%(MAX-MIN)
ret+=MIN
return ret
if 0:
import pprint
def print_optimizer(optimizer):
state_dict=optimizer.state_dict()
param_groups=state_dict['param_groups']
# for i,param_group in enumerate(param_groups):
pprint.pprint(param_groups)
def dic_key_str_2_int(dic: dict) -> dict:
ret = {}
for k, v in dic.items():
if isinstance(k, str) and k.isdigit():
k = int(k)
ret[k] = v
return ret
def dic_key_str_2_int__nested(dic: dict) -> dict:
ret = {}
for k, v in dic.items():
if isinstance(k, str) and k.isdigit():
k = int(k)
if isinstance(v, dict):
v = dic_key_str_2_int__nested(v)
ret[k] = v
return ret
def dic_list_2_tuple_nested(dic: dict) -> dict:#if k,v is list, to tuple
ret = {}
for k, v in dic.items():
if isinstance(k, list):
k = tuple(k)
if isinstance(v, list):
v = tuple(v)
if isinstance(v, dict):
v = dic_list_2_tuple_nested(v)
ret[k] = v
return ret
import re
def inverse_fstring(string:str,fmt:str,):
"""
Inverse of string format in python
from https://stackoverflow.com/questions/48536295/inverse-of-string-format-in-python
"""
reg_keys = '{([^{}:]+)[^{}]*}'
reg_fmts = '{[^{}:]+[^{}]*}'
pat_keys = re.compile(reg_keys)
pat_fmts = re.compile(reg_fmts)
keys = pat_keys.findall(fmt)
lmts = pat_fmts.split(fmt)
temp = string
values = []
for lmt in lmts:
if not len(lmt)==0:
value,temp = temp.split(lmt,1)
if len(value)>0:
values.append(value)
if len(temp)>0:
values.append(temp)
return dict(zip(keys,values))
def sort_strings_asc_A(l:list,fmt:str)->list:
"""
fmt: eg. 'home/frame{d}.png'
"""
ret=sorted(l, key= lambda s:int( inverse_fstring(s, fmt )['d']) )
return ret
from natsort import natsorted
def ls_natsort(folder,re_="*"):
folder = Path(folder)
files = list(folder.glob(re_))
return natsorted(files )
return natsorted(files, key=lambda x: x.name)
if __name__=='__main__':
print( beijing_str_A() )
if 1:
fmt = '{k1:}+{k2:}={k:3}'
res = '1+1=2'
print (inverse_fstring(res,fmt))
fmt = '{name:} {age:} {gender}'
res = 'Alice 10 F'
print (inverse_fstring(res,fmt))
fmt = 'Hi, {k1:}, this is {k2:}'
res = 'Hi, Alice, this is Bob'
print (inverse_fstring(res,fmt))