manière plus efficace aux colonnes de fusion dans Pandas

voix
0

Mon code calcule la distance euclidienne entre tous les points dans un ensemble d'échantillons que j'ai. Ce que je veux savoir est en général ce la façon la plus efficace d'effectuer une opération entre tous les éléments d'un ensemble, puis les tracer, par exemple pour faire une matrice de corrélation.

L'indice d'échantillons est utilisé pour initialiser la trame de données et fournir des étiquettes. Ensuite, les coordonnées 3D sont fournies à titre tuples dans three_D_coordinate_tuple_list mais cela pourrait facilement être une mesure et la distance variable pourrait être une opération. Je suis curieux de trouver une solution plus efficace pour faire de chaque colonne, puis de les fusionner à nouveau en utilisant les pandas ou numpy. Est-ce que j'engorgent une mémoire avec ma solution? Comment puis-je faire ce nettoyeur?

def euclidean_distance_matrix_maker(three_D_coordinate_tuple_list, index_of_samples):
#list of tuples
#well_id or index as series or list

n=len(three_D_coordinate_tuple_list)
distance_matrix_df=pd.DataFrame(index_of_samples)    

for i in range(0, n):
    column=[]
    #iterates through all elemetns calculates distance vs this element
    for j in range(0, n):
        distance=euclidean_dist_threeD_for_tuples( three_D_coordinate_tuple_list[i],
                                         three_D_coordinate_tuple_list[j])
        column.append(distance)
    #adds euclidean distance to a list which overwrites old data frame then 
    #is appeneded with concat column wise to output matrix
    new_column=pd.DataFrame(column)
    distance_matrix_df=pd.concat([distance_matrix_df, new_column], axis=1)

distance_matrix_df=distance_matrix_df.set_index(distance_matrix_df.iloc[:,0])
distance_matrix_df=distance_matrix_df.iloc[:,1:]
distance_matrix_df.columns=distance_matrix_df.index
Créé 13/01/2020 à 22:05
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Installer

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

scipy.spatial.distance_matrix

from scipy.spatial import distance_matrix

distance_matrix(x, x)

array([[ 0.        ,  5.19615242, 10.39230485],
       [ 5.19615242,  0.        ,  5.19615242],
       [10.39230485,  5.19615242,  0.        ]])

numpy

from scipy.spatial.distance import squareform

i, j = np.triu_indices(len(x), 1)
((x[i] - x[j]) ** 2).sum(-1) ** .5

array([ 5.19615242, 10.39230485,  5.19615242])

Ce que nous pouvons faire en une forme carrée squareform

squareform(((x[i] - x[j]) ** 2).sum(-1) ** .5)

array([[ 0.        ,  5.19615242, 10.39230485],
       [ 5.19615242,  0.        ,  5.19615242],
       [10.39230485,  5.19615242,  0.        ]])
Créé 13/01/2020 à 22:29
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more