/timm's /charming /python /tricks
Download
lib.py.
Read more on How to be Charming (in Python).
001: import sys,time,random,re,math 002: sys.dont_write_bytecode=True # don't make .pyc files 003: from the import * 004: from demo import * 005: 006: #---- Standard maths stuff ------------------------- 007: 008: e = math.e 009: log = math.log 010: any = random.uniform 011: rand = random.random 012: shuffle = random.shuffle 013: 014: def weibull(x,l,k): 015: if x <= 0: return 0 016: k *= 1.0; x *= 1.0; l *= 1.0 017: return k/l*((x/l)**(k-1))*e**(-1*(x/l)**k) 018: 019: #---- Collection stuff ----------------------------- 020: 021: def first(x) : return x[0] 022: def second(x): return x[1] 023: 024: def mostest(d, sortBy=second,reverse=True): 025: "Return a dictionary string, sorted by values." 026: l = [(k,v) for k,v in sorted(d.items())] 027: l = sorted(l,key= sortBy,reverse=reverse) 028: l = [':%s %s' % (k,v) for k,v in l] 029: return ' '.join(l) 030: 031: def median(l,ordered=False): 032: if not ordered: 033: lst = sorted(l) 034: n = len(l) 035: i = n/2 036: return l[i] if n % 2 else (l[i] + l[i+1])/2.0 037: 038: def pairs(lst): 039: last=lst[0] 040: for i in lst[1:]: 041: yield last,i 042: last = i 043: 044: class AutoDict(dict): 045: def __init__(i,default): 046: i.default= default 047: def __getitem__(i,key): 048: if key in i: 049: return i.get(key) 050: return i.setdefault(key,i.default()) 051: 052: 053: class Deep(dict): 054: def __getitem__(i, item): 055: try: 056: return dict.__getitem__(i, item) 057: except KeyError: 058: value = self[item] = type(i)() 059: return value 060: 061: #---- timing -------------------------- 062: def msecs(f): 063: t1 = time.time() 064: f() 065: return (time.time() - t1)*1000.0 066: 067: #---- Stochastic sampling -------------------------- 068: 069: def resetSeed(n=The.math.seed): 070: """ 071: Important: before running any code 072: that does any random sampling, reset the 073: seed (so you can debug crashes) 074: """ 075: random.seed(n) 076: 077: def one(lst) : 078: "Return any one item in a list" 079: return lst[int(any(0,len(lst)))] 080: 081: def few(lst,n): 082: "Return any n items in a list, no repeats." 083: m = len(lst) 084: where = [] 085: for _ in range(n*5): # try a few times 086: x = int(any(0,m)) 087: if not x in where: where += [x] 088: if len(where) == n: break 089: return [lst[x] for x in where] 090: 091: def some(d,enough=10**32): 092: """ 093: Given a dictionary d{k1=n1, k2=n2, ...}, 094: return enough keys ki at probability 095: pi = ni/n where n = n1+n2+.. 096: e.g. 097: for key in some({'box':30,'circle':20,'line':10},20) 098: print key 099: 100: will return around twice as many boxes as anything else, 101: circles 1/3rd of the time and lines 1/6th of the time. 102: """ 103: n, lst = 0, [] 104: for x in d: 105: n += d[x] 106: lst += [(d[x],x)] 107: lst = sorted(lst, reverse=True) 108: while enough > 0: 109: r = random.random() 110: for freq,thing in lst: 111: r -= freq*1.0/n 112: if r <= 0: 113: yield thing 114: enough -= 1 115: break 116: 117: #---- Print stuff ---------------------------------- 118: 119: def gs(lst,f='%4.3f'): 120: "Print a list of numbers in abbreviated format." 121: return ', '.join([f % x for x in lst]) 122: 123: def say(*lst): 124: """"Write n arguments to standard output with 125: no new line at the end.""" 126: sys.stdout.write(','.join(map(str,lst))) 127: sys.stdout.flush() 128: 129: #---- Iterators --------------------------------- 130: 131: def item(x) : 132: "Return all non-list items in a nested list" 133: if isinstance(x,(tuple,list)): 134: for y in x: 135: for z in item(y): yield z 136: else: yield x 137: 138: #---- plotting --------------------------------- 139: 140: def plot2d(x,y,xlabel="x",ylabel="y", 141: title="Plot",file=None, 142: width=3, 143: height=3): 144: "Print a 2d plot. If 'file' not given, show on screen" 145: print title,file 146: import matplotlib.pyplot as plt 147: plt.xlabel(xlabel) 148: plt.ylabel(ylabel) 149: plt.title(title) 150: plt.gcf().set_size_inches(width,height) 151: plt.plot(x, y, 'ro') 152: plt.subplots_adjust(bottom=0.2,left=0.2) 153: plt.savefig(file) if file else plt.show() 154: 155:
This file is part of Timm's charming Python tricks.
© 2014, Tim Menzies:
tim.menzies@gmail.com,
http://menzies.us.
Timm's charming Python tricks are free software: you can redistribute it and/or modify it under the terms of the GNU Lesser Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Timm's charming Python tricks are distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU Lesser Public License along with Foobar. If not, see http://www.gnu.org/licenses.