Más manera eficiente de las columnas de combinación en pandas

votos
0

Mi código calcula la distancia euclídea entre todos los puntos en un conjunto de muestras que tengo. Lo que yo quiero saber es, en general, de esta manera el más eficiente para llevar a cabo alguna operación entre todos los elementos de un conjunto y luego trazar ellos, por ejemplo, para hacer una matriz de correlación.

El índice de muestras se utiliza para inicializar la trama de datos y proporcionar etiquetas. A continuación, las coordenadas 3D se proporcionan como tuplas en three_D_coordinate_tuple_list pero esto podría fácilmente ser cualquier medición y entonces la distancia variable podría ser cualquier operación. Tengo curiosidad por encontrar una solución más eficiente para lograr cada columna y luego fusionarlos de nuevo utilizando el panda o numpy. Estoy obstruyendo cualquier memoria con mi solución? ¿Cómo puedo hacer que este limpiador?

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
Publicado el 14/01/2020 a las 00:05
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Preparar

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

¿Qué podemos hacer en una forma cuadrada 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.        ]])
Respondida el 14/01/2020 a las 00:29
fuente por usuario

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