def pseudotime_analysis(self, vlm, figsize=(9,9), dpi=100):
		nn = NearestNeighbors(50)
		nn.fit(ind4.pcs[:,:4])
		knn_pca = nn.kneighbors_graph(mode='distance')
		knn_pca = knn_pca.tocoo()
		G = igraph.Graph(list(zip(knn_pca.row, knn_pca.col)), directed=False, edge_attrs={'weight': knn_pca.data})
		VxCl = G.community_multilevel(return_levels=False, weights="weight")
		labels = np.array(VxCl.membership)

		pc_obj = principal_curve(ind4.pcs[:,:4], False)
		pc_obj.arclength = np.max(pc_obj.arclength) - pc_obj.arclength
		labels = np.argsort(np.argsort(aggregate_np(labels, pc_obj.arclength, func=np.median)))[labels]

		manual_annotation = {str(i):[i] for i in labels}
		annotation_dict = {v:k for k, values in manual_annotation.items() for v in values }
		clusters = np.array([annotation_dict[i] for i in labels])
		colors20 = np.vstack((plt.cm.tab20b(np.linspace(0., 1, 20))[::2], plt.cm.tab20c(np.linspace(0, 1, 20))[1::2]))
		vlm.set_clusters(clusters, cluster_colors_dict={k:colors20[v[0] % 20,:] for k,v in manual_annotation.items()})

		k = 550
		vlm.knn_imputation(n_pca_dims=n_comps,k=k, balanced=True,
						   b_sight=np.minimum(k*8, vlm.S.shape[1]-1),
						   b_maxl=np.minimum(k*4, vlm.S.shape[1]-1))

		vlm.normalize_median()
		vlm.fit_gammas(maxmin_perc=[2,95], limit_gamma=True)

		vlm.normalize(which="imputed", size=False, log=True)
		vlm.Pcs = np.array(vlm.pcs[:,:2], order="C")

		vlm.predict_U()
		vlm.calculate_velocity()
		vlm.calculate_shift()
		vlm.extrapolate_cell_at_t(delta_t=1)

		vlm.estimate_transition_prob(hidim="Sx_sz", embed="Pcs", transform="log", psc=1,
							 n_neighbors=150, knn_random=True, sampled_fraction=1)

		vlm.calculate_grid_arrows(smooth=0.9, steps=(25, 25), n_neighbors=200)

		vlm.set_clusters(ind4.ca["ClusterName"])
		plt.figure(None,figsize=figsize, dpi=dpi)
		vlm.plot_grid_arrows(scatter_kwargs_dict={"alpha":0.7, "lw":0.7, "edgecolor":"0.4", "s":70, "rasterized":True},
							 min_mass=2.9, angles='xy', scale_units='xy',
							 headaxislength=2.75, headlength=5, headwidth=4.8, quiver_scale=0.35, scale_type="absolute")
		plt.plot(pc_obj.projections[pc_obj.ixsort,0], pc_obj.projections[pc_obj.ixsort,1], c="w", lw=6, zorder=1000000)
		plt.plot(pc_obj.projections[pc_obj.ixsort,0], pc_obj.projections[pc_obj.ixsort,1], c="k", lw=3, zorder=2000000)
		plt.gca().invert_xaxis()
		plt.axis("off")
		plt.axis("equal");
示例#2
0
def build_histogram(x_hist,
                    data_mat,
                    N_x_bins,
                    N_y_bins,
                    weighting_vec=1,
                    min_resp=None,
                    max_resp=None,
                    func=None,
                    debug=False,
                    *args,
                    **kwargs):
    """
    Creates histogram for a single block of pixels

    Parameters
    ----------
    x_hist : 1D numpy array
        bins for x-axis of 2d histogram
    data_mat : numpy array
        data to be binned for y-axis of 2d histogram
    weighting_vec : 1D numpy array or float
        weights. If setting all to one value, can be a scalar
    N_x_bins : integer
        number of bins in the x-direction
    N_y_bins : integer
        number of bins in the y-direction
    min_resp : float
        minimum value for y binning
    max_resp : float
        maximum value for y binning
    func : function
        function to be used to bin data_vec.  All functions should take as input data_vec.
        Arguments should be passed properly to func.  This has not been heavily tested.
    debug : bool, optional
        If True, extra debugging statements are printed.  Default False

    Returns
    -------
    pixel_hist : 2D numpy array
        contains the histogram of the input data

    Apply func to input data, convert to 1D array, and normalize
    """
    if func is not None:
        y_hist = func(data_mat, *args, **kwargs)
    else:
        y_hist = data_mat
    '''
    Get the min_resp and max_resp from y_hist if they are none
    '''
    if min_resp is None:
        min_resp = np.min(y_hist)
    if max_resp is None:
        max_resp = np.max(y_hist)
    if debug:
        print('min_resp', min_resp, 'max_resp', max_resp)

    y_hist = __scale_and_discretize(y_hist, N_y_bins, max_resp, min_resp,
                                    debug)
    '''
    Combine x_hist and y_hist into one matrix
    '''
    if debug:
        print(np.shape(x_hist))
        print(np.shape(y_hist))

    try:
        group_idx = np.zeros((2, x_hist.size), dtype=np.int32)
        group_idx[0, :] = x_hist
        group_idx[1, :] = y_hist
    except:
        raise
    '''
    Aggregate matrix for histogram of current chunk
    '''
    if debug:
        print(np.shape(group_idx))
        print(np.shape(weighting_vec))
        print(N_x_bins, N_y_bins)

    try:
        if not disable_histogram:
            pixel_hist = aggregate_np(group_idx,
                                      weighting_vec,
                                      func='sum',
                                      size=(N_x_bins, N_y_bins),
                                      dtype=np.int32)
        else:
            pixel_hist = None
    except:
        raise

    return pixel_hist
示例#3
0
def buildHistogram(x_hist,
                   data_mat,
                   N_x_bins,
                   N_y_bins,
                   weighting_vec=1,
                   min_resp=None,
                   max_resp=None,
                   func=None,
                   debug=False,
                   *args,
                   **kwargs):
    '''
        Creates histogram for a single block of pixels
        
        Parameters:
        -------------
        x_hist : 1D numpy array
            bins for x-axis of 2d histogram
        data_mat : numpy array
            data to be binned for y-axis of 2d histogram
        weighting_vec : 1D numpy array or float
            weights. If setting all to one value, can be a scalar
        N_x_bins : integer
            number of bins in the x-direction
        N_y_bins : integer 
            number of bins in the y-direction
        min_resp : float
            minimum value for y binning
        max_resp : float
            maximum value for y binning
        func : function
            function to be used to bin data_vec.  All functions should take as input data_vec.
            Arguments should be passed properly to func.  This has not been heavily tested.
                
        Output:
        --------------
        pixel_hist : 2D numpy array
            contains the histogram of the input data
        
            
        
        Apply func to input data, convert to 1D array, and normalize
        '''
    if debug: print 'min_resp', min_resp, 'max_resp', max_resp
    y_hist = data_mat
    if func is not None:
        y_hist = func(y_hist, *args, **kwargs)
    y_hist = np.squeeze(np.reshape(y_hist, (data_mat.size, 1)))
    y_hist = np.clip(y_hist, min_resp, max_resp, y_hist)
    y_hist = y_hist - min_resp
    y_hist = y_hist / (max_resp - min_resp)
    '''
        Descritize y_hist
        '''
    y_hist = np.rint(y_hist * (N_y_bins - 1))
    if debug: print 'ymin', min(y_hist), 'ymax', max(y_hist)
    '''
        Combine x_hist and y_hist into one matrix
        '''
    if debug:
        print np.shape(x_hist)
        print np.shape(y_hist)

    try:
        group_idx = np.zeros((2, x_hist.size), dtype=np.int32)
        group_idx[0, :] = x_hist
        group_idx[1, :] = y_hist
    except:
        raise
    '''
        Aggregate matrix for histogram of current chunk
        '''
    if debug:
        print np.shape(group_idx)
        print np.shape(weighting_vec)
        print N_x_bins, N_y_bins

    try:
        pixel_hist = npg.aggregate_np(group_idx,
                                      weighting_vec,
                                      func='sum',
                                      size=(N_x_bins, N_y_bins),
                                      dtype=np.int32)
    except:
        raise

    return pixel_hist
示例#4
0
def aggregate_group_loop(*args, **kwargs):
    """wraps func in lambda which prevents aggregate_numpy from
    recognising and optimising it. Instead it groups and loops."""
    func = kwargs['func']
    del kwargs['func']
    return aggregate_np(*args, func=lambda x: func(x), **kwargs)
示例#5
0
    """wraps func in lambda which prevents aggregate_numpy from
    recognising and optimising it. Instead it groups and loops."""
    func = kwargs['func']
    del kwargs['func']
    return aggregate_np(*args, func=lambda x: func(x), **kwargs)


print("TODO: use more extensive tests")
print("")
print("-----simple examples----------")
test_a = np.array([12.0, 3.2, -15, 88, 12.9])
test_group_idx = np.array([1, 0, 1, 4, 1  ])
print("test_a: ", test_a)
print("test_group_idx: ", test_group_idx)
print("aggregate(test_group_idx, test_a):")
print(aggregate_np(test_group_idx, test_a))  # group vals by idx and sum
# array([3.2, 9.9, 0., 0., 88.])
print("aggregate(test_group_idx, test_a, sz=8, func='min', fill_value=np.nan):")
print(aggregate_np(test_group_idx, test_a, size=8, func='min', fill_value=np.nan))
# array([3.2, -15., nan, 88., nan, nan, nan, nan])
print("aggregate(test_group_idx, test_a, sz=5, func=lambda x: ' + '.join(str(xx) for xx in x),fill_value='')")
print(aggregate_np(test_group_idx, test_a, size=5, func=lambda x: ' + '.join(str(xx) for xx in x), fill_value=''))


print("")
print("---------testing--------------")
print("compare against group-and-loop with numpy")
testable_funcs = {aliasing[f]: f for f in (np.sum, np.prod, np.any, np.all, np.min, np.max, np.std, np.var, np.mean)}
test_group_idx = np.random.randint(0, int(1e3), int(1e5))
test_a = np.random.rand(int(1e5)) * 100 - 50
test_a[test_a > 25] = 0  # for use with bool functions
    if pca:
        results.PCs = np.array(xr) #only the used components

    return results

nn = NearestNeighbors(50)
nn.fit(ind_pseudotime.pcs[:,:4])
knn_pca = nn.kneighbors_graph(mode='distance')
knn_pca = knn_pca.tocoo()
G = igraph.Graph(list(zip(knn_pca.row, knn_pca.col)), directed=False, edge_attrs={'weight': knn_pca.data})
VxCl = G.community_multilevel(return_levels=False, weights="weight")
labels = np.array(VxCl.membership)

pc_obj = principal_curve(ind_pseudotime.pcs[:,:4], False)
pc_obj.arclength = np.max(pc_obj.arclength) - pc_obj.arclength
labels = np.argsort(np.argsort(aggregate_np(labels, pc_obj.arclength, func=np.median)))[labels]

manual_annotation = {str(i):[i] for i in labels}
annotation_dict = {v:k for k, values in manual_annotation.items() for v in values }
clusters = np.array([annotation_dict[i] for i in labels])
colors20 = np.vstack((plt.cm.tab20b(np.linspace(0., 1, 20))[::2], plt.cm.tab20c(np.linspace(0, 1, 20))[1::2]))
#ind_pseudotime.set_clusters(clusters, cluster_colors_dict={k:colors20[v[0] % 20,:] for k,v in manual_annotation.items()})
ind_pseudotime.set_clusters(ind_pseudotime.ca["ClusterName"])

k = 550
ind_pseudotime.knn_imputation(n_pca_dims=n_comps,k=k, balanced=True,
                   b_sight=np.minimum(k*8, ind_pseudotime.S.shape[1]-1),
                   b_maxl=np.minimum(k*4, ind_pseudotime.S.shape[1]-1))

ind_pseudotime.normalize_median()
ind_pseudotime.fit_gammas(maxmin_perc=[2,95], limit_gamma=True)
示例#7
0
def build_histogram(x_hist, data_mat, N_x_bins, N_y_bins, weighting_vec=1, min_resp=None, max_resp=None, func=None,
                    debug=False, *args, **kwargs):
    """
    Creates histogram for a single block of pixels

    Parameters
    ----------
    x_hist : 1D numpy array
        bins for x-axis of 2d histogram
    data_mat : numpy array
        data to be binned for y-axis of 2d histogram
    weighting_vec : 1D numpy array or float
        weights. If setting all to one value, can be a scalar
    N_x_bins : integer
        number of bins in the x-direction
    N_y_bins : integer
        number of bins in the y-direction
    min_resp : float
        minimum value for y binning
    max_resp : float
        maximum value for y binning
    func : function
        function to be used to bin data_vec.  All functions should take as input data_vec.
        Arguments should be passed properly to func.  This has not been heavily tested.
    debug : bool, optional
        If True, extra debugging statements are printed.  Default False

    Returns
    -------
    pixel_hist : 2D numpy array
        contains the histogram of the input data

    Apply func to input data, convert to 1D array, and normalize
    """
    if func is not None:
        y_hist = func(data_mat, *args, **kwargs)
    else:
        y_hist = data_mat

    '''
    Get the min_resp and max_resp from y_hist if they are none
    '''
    if min_resp is None:
        min_resp = np.min(y_hist)
    if max_resp is None:
        max_resp = np.max(y_hist)
    if debug:
        print('min_resp', min_resp, 'max_resp', max_resp)

    y_hist = __scale_and_discretize(y_hist, N_y_bins, max_resp, min_resp, debug)

    '''
    Combine x_hist and y_hist into one matrix
    '''
    if debug:
        print(np.shape(x_hist))
        print(np.shape(y_hist))

    try:
        group_idx = np.zeros((2, x_hist.size), dtype=np.int32)
        group_idx[0, :] = x_hist
        group_idx[1, :] = y_hist
    except:
        raise

    '''
    Aggregate matrix for histogram of current chunk
    '''
    if debug:
        print(np.shape(group_idx))
        print(np.shape(weighting_vec))
        print(N_x_bins, N_y_bins)

    try:
        if not disable_histogram:
            pixel_hist = aggregate_np(group_idx, weighting_vec, func='sum', size=(N_x_bins, N_y_bins), dtype=np.int32)
        else:
            pixel_hist = None
    except:
        raise

    return pixel_hist