2017-02-09 1 views
0

J'essaye d'écrire un script de base qui m'aidera à trouver combien de colonnes similaires il y a entre les lignes. L'information est très simple, quelque chose comme:Comparaison du nombre d'éléments de colonne identiques entre deux lignes en Python

array = np.array([0 1 0 0 1 0 0], [0 0 1 0 1 1 0]) 

je dois exécuter ce script entre toutes les permutations de la liste, la ligne 1 par rapport à la ligne 2, ligne 1 par rapport à la ligne 3, etc.

Toute aide serait grandement appréciée.

+0

Où est la sortie désirée pour votre exemple? Et de quelle rangée 3 parlez-vous? Je ne vois que deux rangées. Et votre code est invalide. –

+1

Comment définissez-vous "similaire"? – Divakar

Répondre

0

Votre question de titre peut être adressée avec des techniques numpy de base. Supposons que vous avez un tableau de numpy deux d a et vous voulez comparer les lignes m et n:

row_m = a[m, :] # this selects row index m and all column indices, thus: row m 
row_n = a[n, :] 
shared = row_m == row_n # this compares row_m and row_n element-by-element storing each individual result (True or False) in a separate cell, the result thus has the same shape as row_m and row_n 
overlap = shared.sum() # this sums over all elements in shared, since False is encoded as 0 and True as 1 this returns the number of shared elements. 

La meilleure façon d'appliquer cette recette à toutes les paires de lignes est la diffusion:

first = a[:, None, :] # None creates a new dimension to make space for a second row axis 
second = a[None, :, :] # Same but new dim in first axis 
# observe that axes 0 and 1 in these two array are arranged as for a distance map 
# a binary operation between arrays so layed out will trigger broadcasting, i.e. numpy will compute all possible pairs in the appropriate positions 
full_overlap_map = first == second # has shape nrow x nrow x ncol 
similarity_table = full_overlap_map.sum(axis=-1) # shape nrow x nrow 
0

Si vous pouvez compter sur toutes les lignes d'une valeur binaire étant les « colonnes similaires » count est tout simplement

def count_sim_cols(row0, row1): 
    return np.sum(row0*row1) 

S'il y a la possibilité d'une plus large éventail de valeurs, vous simplement remplacer le produit par une comparaison

def count_sim_cols(row0, row1): 
    return np.sum(row0 == row1) 

Si vous souhaitez une tolérance sur la « similitude », dites-tol, une petite valeur, c'est juste

def count_sim_cols(row0, row1): 
    return np.sum(np.abs(row0 - row1) < tol) 

Ensuite, vous pouvez double-imbriqué boucle pour obtenir les comptes. Si l'on suppose X est un tableau de numpy avec n lignes

sim_counts = {} 
for i in xrange(n): 
    for j in xrange(i + 1, n): 
     sim_counts[(i, j)] = count_sim_cols(X[i], X[j])