Efficiëntere manier voor het samenvoegen kolommen in panda's

stemmen
0

Mijn code berekent de Euclidische afstand tussen alle punten in een set van monsters die ik heb. Wat ik wil weten is in het algemeen is dit de meest efficiënte manier om een ​​aantal tussen alle elementen in een set uit te voeren en vervolgens plot hen, bijvoorbeeld om een ​​correlatie matrix te maken.

De index van de monsters wordt gebruikt om het dataframe initialiseren en zorgen voor labels. Vervolgens de 3D coördinaten worden als tuples in three_D_coordinate_tuple_list maar dit kan gemakkelijk een meting en dan zou de variabele afstand elke operatie. Ik ben nieuwsgierig naar het vinden van een meer efficiënte oplossing voor het maken van elke kolom en vervolgens samen te voegen ze weer met behulp van panda's of numpy. Ben ik verstoppingen van elke geheugen met mijn oplossing? Hoe kan ik dit schoner te maken?

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
De vraag is gesteld op 13/01/2020 om 22:05
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Opstelling

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])

Die we kunnen maken in een vierkante vorm met 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.        ]])
antwoordde op 13/01/2020 om 22:29
bron van user

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