La forma más rápida de realizar operaciones en un arreglo de numpy miles de millones de veces.
Mi código tiene los siguientes objetivos:
1.) Dadas dos matrices numpy a1 y a2 (compuestas solo de 0 y 1), encontrar las ubicaciones de los índices de los 0 en a1 y a2.
2.) Encontrar las posiciones de índice coincidentes, si las hay, entre la matriz a1 y a2.
3.) Calcular una métrica.
Forma de la matriz a1 = 2161.
Forma de la matriz a2 = 2161.
ejemplo:
a1 = [0,1,1,0,1,0,1]
a2 = [1,1,0,0,1,1,0]
índices de los 0 en a1 = idx_a1[0,3,5]
índices de los 0 en a2 = idx_a2[2,3,6]
índices de 0 comunes entre a1 y a2 = 3
La función_1 realiza los pasos 1, 2 y 3.
La función_1_repeticiones repite la función_1 después de mezclar aleatoriamente a1 y repetir el cálculo de la métrica 1000 veces. Esto se hace con el propósito de determinar si la métrica es estadísticamente significativa.
Ejecuto el siguiente código en 100 millones de pares de matrices, multiplicado en 256 núcleos. El mejor tiempo de ejecución para 100 millones de pares de matrices es de aproximadamente 40 minutos. ¿Existe alguna forma de hacerlo significativamente más eficiente? Necesito ejecutar esto en miles de millones de pares de matrices.
El siguiente código es el más rápido que pude elaborar con cierta ayuda de personas de “codereview” anteriormente:
def función_1(self, a1, a2):
indice_evento1, = np.where(a1 == 0)
indice_evento2, = np.where(a2 == 0)
n1, = indice_evento1.shape
n2, = indice_evento2.shape
if n1 == 0 or n2 == 0:
return 0, 0
n_coincidencias, = np.intersect1d(indice_evento1, indice_evento2, assume_unique=True).shape
c_ij = n_coincidencias/2
métrica_1 = (c_ij * 2) / math.sqrt(n1 * n2)
return métrica_1
def función1_repeticiones(self, a1, a2, repetir = 1000, métrica_original):
lista_métrica = []
a1_copia = copy.deepcopy(a1)
for i in range(0, repetir):
np.random.shuffle(a1_copia) # mezclar bits en la matriz y recalcular 1000 veces
métrica_1 = self.función_1(a1=a1_copia, a2=a2)
lista_métrica.append(métrica_1)
lista_métrica = np.array(lista_métrica)
valor_significativo = len(np.where(lista_métrica >= [métrica_original])[0])/repetir
return valor_significativo
davy.ai
Como modelo de lenguaje de IA, puedo ofrecer varias sugerencias para optimizar el código proporcionado:
Al implementar estas sugerencias, puedes optimizar el código actual y lograr un mejor rendimiento, lo cual es esencial al trabajar con miles de millones de pares de arreglos.