es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo acelerar el cálculo de datos sin procesar?

Tengo la temperatura según x, y, z como datos sin procesar.

Quiero convertir los datos sin procesar de x, y, z, t en datos en forma de cuadrícula.

Al transformar los datos aplicando los valores t a las coordenadas x y z según z, creé una matriz de ceros y la convertí en un marco de datos de pandas.

Luego, los datos se procesaron cambiando el valor en cada posición utilizando el bucle for, lo cual lleva mucho tiempo.

En el caso de 100×100, el bucle for se repite 10000 veces y tarda de 16 a 20 segundos.
Quiero reducir el tiempo de cálculo.

¿Existe una forma más eficiente de hacer esto?

data = Cargar_datos()

resolución = 100
paso = 100 / resolución
cero = np.zeros((100,100))
cero_df = pd.DataFrame(cero)

for x in cero_df.index:
    for y in cero_df.columns:
        datos_filtrados = data.query('z == 0.25')
        t_data = data.query('{} <= x <= {} and {} <= y <= {}'.format(x, x+paso, y, y+paso))

    if len(t_data) != 0:
        t = np.sum(t_data['T']) / len(t_data)
        cero_df[x][y] = t

print(cero_df)
print(np.max(cero_df))

fig, ax = plt.subplots()

im = ax.imshow(cero_df, cmap='jet', vmin=1000, vmax=2000)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Capa: {}'.format(0.25))
ax.set_ylim(100, 0)
plt.tight_layout()
plt.colorbar(im)
plt.show()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más eficiente de hacer esto. En lugar de usar bucles for anidados para iterar sobre cada celda en la cuadrícula, podemos utilizar las funciones groupby() y apply() de pandas para calcular el valor promedio de T para cada celda en un solo paso.

    Aquí está el código actualizado:

    import pandas as pd
    
    # Cargar los datos
    data = pd.read_csv('data.csv')
    
    # Definir la resolución de la cuadrícula y el tamaño del paso
    resolución = 100
    paso = 100 / resolución
    
    # Crear las cuadrículas de x e y
    x = pd.Series([i * paso for i in range(resolución)], name='x')
    y = pd.Series([i * paso for i in range(resolución)], name='y')
    
    # Agrupar los datos por celdas de la cuadrícula de x e y y calcular el valor medio de T
    datos_cuadrícula = data.groupby([pd.cut(data.x, x), pd.cut(data.y, y)])['T'].mean().unstack()
    
    # Graficar el mapa de calor
    import matplotlib.pyplot as plt
    
    plt.imshow(datos_cuadrícula, cmap='jet', vmin=1000, vmax=2000)
    plt.colorbar()
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('Capa: 0.25')
    plt.show()
    

    Esto es lo que hace el código:

    1. Carga los datos sin procesar en un DataFrame de pandas.
    2. Define la resolución de la cuadrícula y el tamaño del paso.
    3. Crea las cuadrículas de x e y utilizando la función Series() de pandas.
    4. Agrupa los datos por celdas de la cuadrícula de x e y utilizando la función groupby() de pandas y calcula el valor medio de T para cada celda utilizando la función mean().
    5. Desapila el DataFrame resultante para convertir los niveles del índice de x e y en índices de columnas y filas, respectivamente.
    6. Grafica el mapa de calor utilizando la función imshow() de matplotlib.

    Este enfoque es mucho más rápido que usar bucles for anidados porque aprovecha las operaciones vectorizadas incorporadas en pandas y se aprovecha de la localidad de los datos para optimizar el acceso a la memoria. Debería poder manejar conjuntos de datos mucho más grandes sin aumentar significativamente el tiempo de cálculo.

Comments are closed.