加速三重循环
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'的公式。你知道怎么做吗?
您可以将 centros
和 datos
重塑为三个维度以利用广播:
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)
最初我有循环
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'的公式。你知道怎么做吗?
您可以将 centros
和 datos
重塑为三个维度以利用广播:
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)