Skip to content

Commit a94fc50

Browse files
committed
ver 0.15.12 added many vector viz features
1 parent c7b0c96 commit a94fc50

File tree

12 files changed

+229
-3
lines changed

12 files changed

+229
-3
lines changed

npy/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
from . import ex
99
from . import calc
1010
from . import data
11+
from . import viz

npy/tools/tsne.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import matplotlib.pyplot as plt
22
import numpy as np
3+
from ..utils import index_l_of_d
34
from .multirank.modify import flatten_vectors, unflatten_vectors
45
from .multirank.recursive import get_lengths
56

@@ -30,7 +31,7 @@ def draw_tsne(X, n=4, **kwargs): # [C, N, D]
3031
for c in range(C):
3132
print(c, len(emb[c]))
3233

33-
_kwargs = {k: v[c] if isinstance(v, list) else v for k, v in kwargs.items()}
34+
_kwargs = index_l_of_d(kwargs, c)
3435
plt.scatter(*emb[c].T, s=10, **_kwargs)
3536

3637

npy/utils/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
from .utils_info import *
99
from .utils_mask import *
1010
from .utils_decorator import *
11+
from . import multirank

npy/utils/multirank/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .basic import *
2+
from .modify import *
3+
from . import recursive

npy/utils/multirank/basic.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import numpy as np
2+
3+
__all__ = ['is_array', 'is_singleton', 'is_vector', 'is_matrix', 'is_multirank', 'argmin', 'argmax']
4+
5+
6+
def is_array(v):
7+
return isinstance(v, list) or isinstance(v, np.ndarray)
8+
9+
10+
def is_singleton(v):
11+
return not is_array(v)
12+
13+
14+
def is_vector(X):
15+
if is_singleton(X):
16+
return False
17+
return is_singleton(X[0])
18+
19+
20+
def is_matrix(X):
21+
if is_singleton(X):
22+
return False
23+
return is_vector(X[0])
24+
25+
26+
def is_multirank(X):
27+
if is_singleton(X):
28+
return False
29+
return is_matrix(X)
30+
31+
32+
#########
33+
34+
def argmin(X):
35+
ind = np.argmin(X)
36+
return np.unravel_index(ind, X.shape)
37+
38+
39+
def argmax(X):
40+
ind = np.argmax(X)
41+
return np.unravel_index(ind, X.shape)

npy/utils/multirank/modify.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import numpy as np
2+
from .basic import *
3+
from .recursive import get_sum, iter_vector
4+
5+
__all__ = ['unflatten_vectors', 'flatten_vectors']
6+
7+
8+
def unflatten_vectors(X, Ns):
9+
if is_vector(Ns):
10+
if len(Ns) == 1:
11+
return [X]
12+
else:
13+
Ncum = np.cumsum(Ns)
14+
return np.split(X, Ncum[:-1])
15+
else:
16+
if len(Ns) == 1:
17+
return [unflatten_vectors(X, Ns[0])]
18+
else:
19+
Nsub = [get_sum(Nss) for Nss in Ns]
20+
Ncum = np.cumsum(Nsub)
21+
Xsplit = np.split(X, Ncum[:-1])
22+
return [
23+
unflatten_vectors(Xone, Nss) for Xone, Nss in zip(Xsplit, Ns)
24+
]
25+
26+
27+
def flatten_vectors(X): # [N1, ..., N2, D] -> [N, D]
28+
ret = list()
29+
for vec in iter_vector(X):
30+
ret.append(vec)
31+
return np.stack(ret)

npy/utils/multirank/recursive.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import numpy as np
2+
from .basic import *
3+
4+
__all__ = ['get_D', 'get_lengths', 'get_sum', 'get_dtype',
5+
'equal', 'iter_vector', 'iter_element']
6+
7+
8+
def get_D(X):
9+
if is_vector(X):
10+
return len(X)
11+
else:
12+
return get_D(X[0])
13+
14+
15+
def get_lengths(X):
16+
if is_matrix(X):
17+
return len(X)
18+
else:
19+
return [get_lengths(x) for x in X]
20+
21+
22+
def get_sum(X):
23+
if is_singleton(X):
24+
return X
25+
else:
26+
return sum([get_sum(x) for x in X])
27+
28+
29+
def get_dtype(X):
30+
if is_singleton(X):
31+
return type(X)
32+
else:
33+
return get_dtype(X[0])
34+
35+
36+
def equal(X1, X2):
37+
if is_singleton(X1) or is_singleton(X2):
38+
return X1 == X2
39+
else:
40+
if len(X1) != len(X2):
41+
return False
42+
return all([equal(x1, x2) for x1, x2 in zip(X1, X2)])
43+
44+
45+
def iter_vector(X):
46+
if is_vector(X):
47+
yield X
48+
else:
49+
for x in X:
50+
yield from iter_vector(x)
51+
52+
53+
def iter_element(X):
54+
if is_singleton(X):
55+
yield X
56+
else:
57+
for x in X:
58+
yield from iter_element(x)

npy/utils/utils_primitive/utils_dict.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
__all__ = ['keys_d_of_l_of_num', 'keys_d_of_num',
55
'append_d_of_l', 'inv_d', 'replace_keys', 'drop_keys',
66
'filter_d_of_l_of_num', 'filter_d_of_num', 'filter_keys', 'filter_empty',
7-
'dict_eq', 'l_of_dict_eq', 'add_d_of_l', 'merge_l_of_d'
7+
'dict_eq', 'l_of_dict_eq', 'add_d_of_l', 'merge_l_of_d', 'index_l_of_d',
88
]
99

1010

@@ -142,3 +142,10 @@ def l_of_dict_eq(l1: list, l2: list) -> bool:
142142
if len(l1) != len(l2):
143143
return False
144144
return all([dict_eq(d1, d2) for d1, d2 in zip(l1, l2)])
145+
146+
147+
############
148+
149+
def index_l_of_d(d, i):
150+
_kwargs = {k: v[i] if isinstance(v, list) else v for k, v in d.items()}
151+
return _kwargs

npy/viz/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from . import scatter
2+
from . import hist

npy/viz/hist.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import numpy as np
2+
import matplotlib.pyplot as plt
3+
from ..utils import multirank, index_l_of_d
4+
5+
__all__ = ['plot', 'plot_std_of_each_dim', 'plot_norm_of_each_vec']
6+
7+
8+
def plot(X, ax=None, bins=50, **kwargs):
9+
if ax is None:
10+
fig, ax = plt.subplots()
11+
12+
if multirank.is_matrix(X): # X [C, N]
13+
C = len(X)
14+
for c in range(C):
15+
_kwargs = index_l_of_d(kwargs, c)
16+
ax.hist(X[c], bins=bins, **_kwargs)
17+
18+
else: # X [N]
19+
ax.hist(X, bins=bins, **kwargs)
20+
return ax
21+
22+
23+
def plot_std_of_each_dim(X, ax=None, bins=50, **kwargs):
24+
if multirank.is_multirank(X): # X [C, N, D]
25+
C = len(X)
26+
stds = [np.std(X[c], axis=0) for c in range(C)]
27+
else: # X [C, N]
28+
stds = np.std(X, axis=0)
29+
30+
return plot(stds, ax=ax, bins=bins, **kwargs)
31+
32+
33+
def plot_norm_of_each_vec(X, ax=None, bins=50, **kwargs):
34+
if multirank.is_multirank(X): # X [C, N, D]
35+
C = len(X)
36+
norms = [np.linalg.norm(X[c], axis=-1) for c in range(C)]
37+
else: # X [C, N]
38+
norms = np.linalg.norm(X, axis=-1)
39+
40+
return plot(norms, ax=ax, bins=bins, **kwargs)

0 commit comments

Comments
 (0)