7
votes

Qu'est-ce qu'un moyen plus efficace de calculer le max de chaque ligne dans une matrice, à l'exclusion de sa propre colonne?

pour une matrice 2D donnée np.array ([[[[[1,1], [2,0,5]]) code> Si l'on doit calculer le max de chaque ligne dans une matrice En excluant sa propre colonne, avec l'exemple attendu retour np.array ([[[[3,1,3], [5,5,2]]) code>, quel serait le moyen le plus efficace de le faire? Actuellement, je l'ai mis en place avec une boucle pour exclure son propre index de col:

n=x.shape[0]
row_max_mat=np.zeros((n,n))
rng=np.arange(n)
for i in rng:
  row_max_mat[:,i] = np.amax(s_a_array_sum[:,rng!=i],axis=1)


0 commentaires

4 Réponses :


2
votes

Vous pouvez le faire en utilisant np.accumuler. Calculez les accumulations avant et arrière des maximums le long de l'axe horizontal, puis combinez-les avec un décalage d'un: xxx

Ceci nécessitera 3x la taille de votre matrice à traiter (bien que vous puissiez prendre ce problème. jusqu'à 2x si vous voulez une mise à jour sur place). L'ajout d'une dimension 3ème et 4ème pourrait également fonctionner à l'aide d'un masque mais qui nécessitera des colonnes ^ 2 fois la taille de la matrice à traiter et sera probablement plus lente.

Si nécessaire, vous pouvez appliquer la même colonne technique sage ou aux deux dimensions. (en combinant des résultats sage sur la ligne et la colonne).


0 commentaires

1
votes
a = np.array([[1,3,1],[2,0,5]])

row_max = a.max(axis=1).reshape(-1,1)
b = (((a // row_max)+1)%2)
c = b*row_max
d = (a // row_max)*((a*b).max(axis=1).reshape(-1,1))

c+d # result

0 commentaires

3
votes

idée similaire à la vôtre (exclure des colonnes une par une), mais avec indexation: xxx

sortie: xxx


0 commentaires

1
votes

4 commentaires

Qu'en est-il de la méthode de Quang?


@ROGANJOSH prenait trop de temps sur ces grands tableaux. Par conséquent, ce commentaire - Autre solution de fonctionnement pour les grandes matrices .


Hein, ok. Olyball, je ne vois pas ce qui explose dans leur approche. Toute idée? (Mise à côté, merci pour Benchit - a l'air cool!)


@ROGANJOSH C'est l'œil annuel avec np.where (masque) le souffle avec des tableaux de taille 1000x1000 ou de taille plus grande. Appréciez les commentaires sur Benchit, l'accent était mis sur le travail de configuration minimale pour obtenir des horaires! :)