In [20]:
    
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from io import BytesIO
import PIL, PIL.Image
    
In [21]:
    
import seaborn as sns
%matplotlib inline
    
In [24]:
    
x, y, z = [np.random.rand(10, 10, 10) for _ in range(3)]
    
In [25]:
    
"weight" in dataframe
    
    Out[25]:
In [26]:
    
data = {"coacts": x.flatten(), "weight": y.flatten(), "grads": z.flatten().astype(np.float16)}
dataframe = pd.DataFrame(data)
    
In [27]:
    
ax = sns.scatterplot(x="coacts", y="weight", hue="grads", data=dataframe);
sns.set(rc={'figure.figsize':(11.7,8.27)}, style="white")
    
    
In [14]:
    
canvas.get_width_height()
    
    Out[14]:
In [12]:
    
# Store image in a string buffer
buffer = BytesIO()
canvas = ax.figure.canvas
canvas.draw()
pilImage = PIL.Image.frombytes("RGB", canvas.get_width_height(), canvas.tostring_rgb())
pilImage.save(buffer, "PNG")
    
In [13]:
    
pilImage
    
    Out[13]:
In [7]:
    
def lineplot(lower_line, middle_line, upper_line, loglog = False, xscale = None, yscale = None, xlim = None, ylim = None, x_list = None, ax = None, line_lable = 'line', x_label = 'x', y_label = 'y', title = 'Plot', color = None):
    
    x_list = x_list if x_list is not None else range(len(middle_line))
    
    # Create the plot object
    fig, ax = (None, ax) if ax is not None else plt.subplots()
    # Plot the data, set the linewidth, color and transparency of the
    # line, provide a label for the legend
    kwargs = {}
    if color     : kwargs['color'] = color
    if line_lable: kwargs['label'] = line_lable
    
    # ax.loglog(x_list, middle_line, lw = 1, alpha = 1, **kwargs)
    if not loglog:
        ax.plot(x_list, middle_line, lw = 1, alpha = 1, **kwargs)
    else:
        ax.loglog(x_list, middle_line, lw = 1, alpha = 1, **kwargs)
    # Adjust x,y scaling.
    if xscale: ax.set_xscale(xscale)
    if yscale: ax.set_yscale(yscale)
    # Shade the confidence interval
    kwargs = {}
    if color     : kwargs['color'] = color
    ax.fill_between(x_list, lower_line, upper_line, alpha = 0.4, **kwargs)
    
    if ylim: ax.set_ylim(*ylim)
    if xlim: ax.set_xlim(*xlim)
    
    # Label the axes and provide a title
    ax.set_title(title)
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
    # Display legend
    ax.legend(loc = 'best')
    
In [8]:
    
from collections import defaultdict
    
In [29]:
    
def calc_onperc(arr):
    size = np.prod(arr.shape)
    return np.sum(arr == 1) / size
trials = 100
N_list = [10, 50, 100, 500, 1000, 2000]
on_perc = 0.1
    
In [30]:
    
sparsity_per_row_1 = defaultdict(list)
sparsity_per_column_1 = defaultdict(list)
    
In [31]:
    
for _ in range(trials):
    for N in N_list:
        w = np.zeros((N, N))
        for r in range(N):
            t = np.random.rand(1, N) < on_perc
            w[r, :] = t
        # Sparsity per row
        spr = [
            calc_onperc(w[r, :])
            for r in range(N)
        ]
        # Sparsity per column
        spc = [
            calc_onperc(w[:, c])
            for c in range(N)
        ]
        sparsity_per_row_1[N].extend(spr)
        sparsity_per_column_1[N].extend(spc)
    
In [32]:
    
sparsity_per_row_2 = defaultdict(list)
sparsity_per_column_2 = defaultdict(list)
    
In [33]:
    
for _ in range(trials):
    for N in N_list:
        w = np.zeros((N, N))
        w[:] = (np.random.rand(N, N) < on_perc)
        # Sparsity per row
        spr = [
            calc_onperc(w[r, :])
            for r in range(N)
        ]
        # Sparsity per column
        spc = [
            calc_onperc(w[:, c])
            for c in range(N)
        ]
        sparsity_per_row_2[N].extend(spr)
        sparsity_per_column_2[N].extend(spc)
    
In [34]:
    
fig, ax = plt.subplots(1, 2, figsize = (20, 10));
    
    
Plot on-perc by row
In [35]:
    
lower_1 = [np.percentile(sparsity_per_row_1[N], 0) for N in N_list]
lower_2 = [np.percentile(sparsity_per_row_2[N], 0) for N in N_list]
upper_1 = [np.percentile(sparsity_per_row_1[N], 1) for N in N_list]
upper_2 = [np.percentile(sparsity_per_row_2[N], 1) for N in N_list]
middl_1 = [np.percentile(sparsity_per_row_1[N], 0.5) for N in N_list]
middl_2 = [np.percentile(sparsity_per_row_2[N], 0.5) for N in N_list]
    
In [36]:
    
lineplot(
    lower_1, middl_1, upper_1,
    ax = ax[0],
    x_list = N_list,
    line_lable = 'fixed', x_label = 'N', y_label = 'on_perc', 
    title = 'On-perc by Row', color = None
)
lineplot(
    lower_2, middl_2, upper_2, 
    ax = ax[0],
    x_list = N_list,
    line_lable = 'random', x_label = 'N', y_label = 'on_perc', 
    title = 'On-perc by Row', color = None
)
    
Plot on-perc by col
In [37]:
    
lower_1b = [np.percentile(sparsity_per_column_1[N], 0) for N in N_list]
lower_2b = [np.percentile(sparsity_per_column_2[N], 0) for N in N_list]
upper_1b = [np.percentile(sparsity_per_column_1[N], 1) for N in N_list]
upper_2b = [np.percentile(sparsity_per_column_2[N], 1) for N in N_list]
middl_1b = [np.percentile(sparsity_per_column_1[N], 0.5) for N in N_list]
middl_2b = [np.percentile(sparsity_per_column_2[N], 0.5) for N in N_list]
    
In [38]:
    
lineplot(
    lower_2b, middl_2b, upper_2b, 
    ax = ax[1],
    x_list = N_list,
    line_lable = 'random', x_label = 'N', y_label = 'on_perc', 
    title = 'On-perc by Column', color = None
)
lineplot(
    lower_1b, middl_1b, upper_1b,
    ax = ax[1],
    x_list = N_list,
    line_lable = 'fixed', x_label = 'N', y_label = 'on_perc', 
    title = 'On-perc by Column', color = None
)
    
In [39]:
    
fig
    
    Out[39]:
In [41]:
    
import random
k = 10
result = [[random.uniform(0, 0.1 / k) for i in range(k)] for j in range(k)]
for j, r in enumerate(result):
    r[j] += 1 - sum(r)
    
w = np.zeros((k, k))
w[:] = np.array(result) < 0.1
w
    
    Out[41]:
In [ ]: