Ich habe zwei große Vektoren item_clusters und Beta. Das Element item_clusters [i] ist die Cluster-ID, zu der der Artikel i gehört. Das Element beta [i] ist eine Punktzahl für den Artikel i. Punkte sind {-1, 0, 1, 2, 3}.Fehlende Wert Anrechnungs in Python
Immer wenn der Punktestand eines bestimmten Eintrags 0 ist, muss ich dies mit dem durchschnittlichen Wert anderer Punkte, die zu demselben Cluster gehören, gleich Null berechnen. Was ist der schnellste Weg dazu?
Dies ist, was ich bisher versucht habe. I umgewandelt, um die item_clusters an eine Matrix clusters_to_items so daß das Element clusters_to_items [ i] [j ] = 1, wenn der Cluster i enthält Artikel j, sonst 0. Danach ich bin Ausführen des folgenden Codes
# beta (1x1.3M) csr matrix
# num_clusters = 1000
# item_clusters (1x1.3M) numpy.array
# clust_to_items (1000x1.3M) csr_matrix
alpha_z = []
for clust in range(0, num_clusters):
alpha = clust_to_items[clust, :]
alpha_beta = beta.multiply(alpha)
sum_row = alpha_beta.sum(1)[0, 0]
num_nonzero = alpha_beta.nonzero()[1].__len__() + 0.001
to_impute = sum_row/num_nonzero
Z = np.repeat(to_impute, beta.shape[1])
alpha_z = alpha.multiply(Z)
idx = beta.nonzero()
alpha_z[idx] = beta.data
interact_score = alpha_z.tolist()[0]
# The interact_score is the required modified beta
# This is used to do some work that is very fast
Das Problem ist, dass dieser Code 150K mal ausgeführt werden muss und es sehr langsam ist. Nach meiner Schätzung wird es 12 Tage dauern.
Edit: Ich glaube, ich brauche eine sehr unterschiedliche Idee, in der ich direkt item_clusters verwenden kann, und nicht jedes Cluster einzeln durchlaufen müssen.
Ok, ich werde das unpopuläre Kind sein hier: Pythons eine großartige Sprache, aber wenn die Leistung ist als genauso wie hier, und besonders, wenn Sie mit riesigen Mengen von Rohdaten zu tun haben, und dies ist Ihr Hotspot, wo die meiste Zeit verbracht wird, implementieren Sie es in C. –
Können Sie herausfinden, welche Codezeile die meiste Zeit benötigt? –
Hinweis: schau dir 'nufunc' von numpy an. –