¿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()
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()
yapply()
de pandas para calcular el valor promedio de T para cada celda en un solo paso.Aquí está el código actualizado:
Esto es lo que hace el código:
Series()
de pandas.groupby()
de pandas y calcula el valor medio de T para cada celda utilizando la funciónmean()
.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.