加速三重循环

Speeding up triple loop

最初我有循环

import numpy

datos = numpy.random.rand(1000,17)
clusters = 250
n_variables = 17
centros = numpy.random.rand(clusters,n_variables)
desviaciones = numpy.random.rand(n_variables)
W=1
H=numpy.zeros((len(datos), clusters))
Weight = 1 / n_variables
for k in range(len(datos)):
    inpt = datos[k]
    for i in range(clusters):
        for j in range(n_variables):
            sup = centros[i][j] + W * desviaciones[j]
            inf = centros[i][j] - W * desviaciones[j]
            feat = np.array(inpt[j])
            if (feat < sup and feat > inf):
                H[k, i] += Weight

但是三重循环会大大减慢该过程。然后,我可以将其减少为:

import numpy

datos = numpy.random.rand(1000,17)
clusters = 250
n_variables = 17
centros = numpy.random.rand(clusters,n_variables)
desviaciones = numpy.random.rand(n_variables)
W=1
H=numpy.zeros((len(datos), clusters))
sup = centros + W*desviaciones
inf = centros - W*desviaciones
Weight = 1 / n_variables
for k in range(len(datos)):
    inpt = datos[k]
    for i in range(clusters):
        suma = (sup[i]>inpt)&(inf[i]<inpt)
        H[k,i]=suma.sum()*Weight

所以我可以保存一个循环,但是我在尝试使用 numpy 函数减少其他循环时遇到了问题。唯一剩下的就是对每一行sup和datos重复'suma'的公式。你知道怎么做吗?

您可以将 centrosdatos 重塑为三个维度以利用广播:

centros = centros[None, :, :]    # (   1, 250, 17)  
datos = datos[:, None, :]        # (1000,   1, 17)
desv = W * desviaciones
sup = centros + desv
inf = centros - desv
H = Weight * ((datos < sup) & (datos > inf)).sum(axis=2)