Más Vectorización de Numpy en lugar de utilizar bucles anidados.
Tengo all_data
como una matriz numpy con un tamaño de (2,601)
, NUM_SAMPLES = 601
y NUM_CLUSTERS = 3
.
¿Existe alguna forma de construir f
(una matriz numpy de (601,9)
) en forma de vector que no implique el uso de bucles anidados como se muestra a continuación?
f = np.empty((0,9), float)
for n in range(NUM_SAMPLES):
f_n = np.array([[]])
for m in range(NUM_CLUSTERS):
f_n = np.hstack( (f_n , z_i(alldata[:,n], m).T))
f = np.concatenate((f, f_n) , axis=0)
NOTA: al recordar la función z_i(alldata[:,n], m)
, devuelve una matriz numpy de (3,1)
.
f
se supone que es ‘F’ en la siguiente fórmula:
fórmula de f
davy.ai
Sí, hay una forma vectorizada de construir
f
sin utilizar bucles for anidados. Puede usar la función de broadcast de numpy para simplificar el código. Aquí hay un ejemplo de código:Explicación:
z
con una forma de(3,1,601)
que contiene los resultados dez_i
para cada valor dem
yn
. Esto se puede hacer utilizando una comprensión de lista ynp.array()
. Agregamos una nueva dimensión de tamaño 1 usando.T
para obtener una forma de(3,1)
, que es el tamaño de la matriz devuelta porz_i()
.repeat()
de numpy para repetirz
a lo largo del segundo eje (eje=1) 9 veces, por lo que la forma resultante es(3,9,601)
. Esto crea una matriz compatible con la transmisión para los pesos.w
con forma(9,601)
, que contiene los pesos para cada componente def
. Esto se hace simplemente repitiendo la matriz de pesos con forma(9,)
a lo largo del segundo eje utilizandorepeat()
y remodelándola con.reshape((-1,1))
.z
yw
para obtener una matriz de forma(3,9,601)
.(601,9)
.Esta forma vectorizada del código debería ser más rápida que los bucles for anidados para matrices grandes.