Je souhaite trier un tableau par la somme de colonne et supprimer le plus grand élément de chaque colonne puis poursuivez le tri.

#sorted by sum of columns
def sorting(a):
   b = np.sum(a, axis = 0)
   idx = b.argsort()
   a = np.take(a, idx, axis=1)
   return a

arr = [[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]]
print(sorting(arr))

Here is the output: 

[[ 2  1  3  8]
 [ 0  3  2  1]
 [ 4  5 25 67]
 [ 1 11  6 10]]

J'ai pu pouvoir trouver le max de chaque colonne et leurs index mais je ne pouvais pas les supprimer sans supprimer toute la ligne / colonne. S'il vous plaît une aide je suis nouveau à numpoper !!!

0
Ibrahim 30 avril 2021 à 09:38

1 réponse

Meilleure réponse

Bien que pas très élégant, une façon d'atteindre cela serait comme celle-ci en utilisant diffusion et Indexation de fantaisie / avancée:

import numpy as np
arr = np.array([[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]])

D'abord, obtenez le tableau intermédiaire trié par les sommes de colonne.

arr1 = arr[:, arr.sum(axis = 0).argsort()]
print(arr1)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 4,  5, 25, 67],
#        [ 1, 11,  6, 10]])

Ensuite, obtenez où se trouvent les maxima dans chaque colonne.

idx = arr1.argmax(axis = 0)
print(idx)
# array([2, 3, 2, 2])

Maintenant, préparer des matrices d'index de ligne et de colonne pour trancher de arr1. Notez que la ligne pour calculer rows exécute essentiellement une différence définie de {0, 1, 2, 3} (en général au nombre de lignes dans arr) pour chaque élément de idx ci-dessus et les stocke le long des colonnes de la matrice rows.

k = np.arange(arr1.shape[0]) # original number of rows
rows = np.nonzero(k != idx[:, None])[1].reshape(-1, arr1.shape[0] - 1).T
cols = np.arange(arr1.shape[1])
print(rows)
# array([[0, 0, 0, 0],
#        [1, 1, 1, 1],
#        [3, 2, 3, 3]])

Notez que cols sera diffusé à la forme de rows lors de l'indexation arr1 par elles. Pour votre compréhension, cols va ressembler à ceci pour être compatible avec rows:

print(np.broadcast_to(cols, rows.shape))

# array([[0, 1, 2, 3],
#        [0, 1, 2, 3],
#        [0, 1, 2, 3]])

Fondamentalement, lorsque vous (fantaisie) index arr1 par eux, vous obtenez la 0ème colonne des rangées 0, 1 et 3; 1ère colonne pour les rangées 0, 1 et 2 et ainsi de suite. J'espère que vous avez l'idée.

arr2 = arr1[rows, cols]
print(arr2)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 1,  5,  6, 10]])

Vous pouvez écrire une fonction simple composant ces étapes pour votre commodité pour effectuer l'opération multiplie.

0
swag2198 30 avril 2021 à 16:55