modo più efficiente per colonne di unione nel pandi

voti
0

Il mio codice calcola la distanza euclidea tra tutti i punti in una serie di campioni che ho. Quello che voglio sapere è, in generale, in questo modo il più efficiente per eseguire alcune operazioni tra tutti gli elementi in un set e poi li trama, ad esempio per fare una matrice di correlazione.

L'indice di campioni viene utilizzato per inizializzare il dataframe e fornire etichette. Allora le coordinate 3D sono forniti come tuple in three_D_coordinate_tuple_list ma questo potrebbe facilmente essere qualsiasi misura e quindi la distanza variabile potrebbe essere qualsiasi operazione. Sono curioso di trovare una soluzione più efficiente per rendere ogni colonna e poi la fusione di nuovo con i panda o NumPy. Sto intasare la memoria con la mia soluzione? Come posso fare questo pulitore?

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
È pubblicato 13/01/2020 alle 22:05
fonte dall'utente
In altre lingue...                            


1 risposte

voti
2

Impostare

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

Che possiamo fare in una forma quadrata con 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.        ]])
Risposto il 13/01/2020 a 22:29
fonte dall'utente

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