0
votes

Python: boucle sur une matrice pour vérifier toutes les valeurs dans un vecteur

J'ai ce vecteur: possibleGrades=np.array([-3,0,2,4,7,10,12 Often )

Et je veux que l'ordinateur me dise où dans cette matrice il y a des valeurs qui ne sont pas du vecteur:

for i in range(matrixGr):
    if (-3) in matrixGr:
        pass
    elif 0 in matrixGr:
        pass
    elif 2 in matrixGr:
        pass
    elif 4 in matrixGr:
        pass
    elif 7 in matrixGr:
        pass
    elif 10 in matrixGr:
        pass
    elif 12 in matrixGr:
        pass
    else:
        print("The data set contains incorrect grades at {location?}!")

Mon idée:

    [[ 7.   7.   4. ]
 [12.  10.  10. ]
 [-3.   7.   2. ]
 [10.   8.  12. ]
 [ nan  7.   nan]
 [ 7.   7.  10. ]
 [ 4.5  nan  2. ]
 [ 2.  12.   4. ]]

Mais ce n'est pas possible et comment le faire est au-delà de ce que ma capacité mentale peut conduire.

Qu'est-ce qu'une manière intelligente et possible?

Ce serait très bien s'il était possible de dire comme " la ligne X contient une note 8 non valide (par exemple) ", donc quelque chose avec la chaîne" ligne {: s} a la note non valide {: s} "et .format (" quelque chose d'intelligent ")

Quelqu'un peut-il aider ceci?


0 commentaires

4 Réponses :


0
votes

Voici un simple oneliner qui renvoie les indices qui ne sont pas dans votre liste de "goodgrades" en utilisant la compréhension de liste et la fonction enumerate ():

for row in range(len(grades)):
    badgrades = checkgrades(grades[row])
    if badgrades != []:
        print('Bad grades found in row {} at indices {}'.format(row, badgrades))

testgrades = [7,10,7 ] ne renvoie rien, tandis que [7, -1,7] renvoie [1].

Pour développer ceci en une liste de listes de notes, vous pouvez l'utiliser comme une fonction:

def checkgrades(grades):
    return [ind for ind, i in enumerate(grades) if i not in goodgrades]

maintenant, vous pouvez l'utiliser en boucle et imprimer les résultats des tests ligne par ligne:

goodgrades = [-3,0,2,4,7,10,12]
testgrades = [10,-3,11]
badgrades = [ind for ind, i in enumerate(testgrades) if i not in goodgrades]


1 commentaires

Remarque: bien que cette approche soit un peu plus verbeuse que la réponse Robustus, cela fonctionne pour les listes qui ont des nombres de notes différents pour chaque sous-liste de notes. Les deux approches sont précieuses, cela dépend de ce dont vous avez besoin!



1
votes

Vous pouvez essayer ceci:

locations:
[(3, 1), (4, 0), (4, 2), (6, 0), (6, 1)]
import numpy as np

possibleGrades = np.array([-3, 0, 2, 4, 7, 10, 12])

matrixGr = np.array([[7, 7, 4],
                   [12, 10, 10],
                   [-3, 7, 2],
                   [10, 8, 12],
                   [np.nan, 7, np.nan],
                   [7, 7, 10],
                   [4.5, np.nan, 2],
                   [2, 12, 4]])

locations = [(i, j) for i in range(matrixGr.shape[0]) for j in range(matrixGr.shape[1]) if matrixGr[i, j] not in possibleGrades]

Bonne chance!


0 commentaires

1
votes

Vous pouvez peut-être essayer ceci:

locations:
Invalid value 8.0 at location (3,1)
Invalid value nan at location (4,0)
Invalid value nan at location (4,2)
Invalid value 4.5 at location (6,0)
Invalid value nan at location (6,1)

Vous devriez obtenir le résultat:

possibleGrades = np.array([-3,0,2,4,7,10,12])
matrix = np.array([
    [ 7. ,  7.,   4. ],
    [12.,  10.  ,10. ],
    [-3.,   7.  , 2. ],
    [10.,   8.  ,12. ],
    [ np.nan,  7.  , np.nan],
    [ 7. ,  7.  ,10. ],
    [ 4.5,  np.nan , 2. ],
    [ 2. , 12.,   4. ]
])
line, col = np.where(np.isin(matrix, possibleGrades, invert=True))
print('locations:')
[print(f'Invalid value {matrix[line[i],col[i]]} at location ({line[i]},{col[i]})') for i in range(line.size)]
  • np.isin : rechercher des éléments dans le vecteur mais l'option invert = True permet d'inverser le résultat.
  • np.where : recherche les lignes et les colonnes correspondant aux éléments True.


2 commentaires

Merci! C'était très utile! J'ai maintenant une question de suivi: `line, col = np.where (np.isin (matrixGrades, possibleGrades, invert = True)) print ('Affichage des notes incorrectes ou manquantes: \ n') [print (f'Incorrect ou note manquante à la ligne {line [i]} de la colonne {col [i]}! Affichage de la note incorrecte: {INSERT VALUE}. ') for i in range (line.size)] `Comment puis-je faire cela? Donc, il affiche la valeur de la ligne qui est incorrecte? J'ai essayé matrix [i] mais ne fonctionne pas. Je me demande aussi, puis-je modifier d'une manière ou d'une autre pour qu'il ne commence pas par la ligne 1 est 0, mais en fait la ligne 1 et la colonne 1 est 1 et non la colonne 0?


J'ai édité la réponse. Pour commencer à la valeur un, vous pouvez en ajouter un aux tableaux line et col afin que (1,1) corresponde au premier élément.



0
votes

Voici un one-liner qui renvoie une matrice booléenne de la même taille que matrixGr , avec True si la note est dans possibleGrades et False sinon:

>>> np.logical_not(np.any(np.stack([e==mat for e in possibleGrades]),axis=0))
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [False,  True, False],
       [ True, False,  True],
       [False, False, False],
       [ True,  True, False],
       [False, False, False]])

Si vous voulez le contraire, ajoutez simplement np.logical_not () autour de celui-ci:

>>> np.any(np.stack([grade==matrixGr for grade in possibleGrades]),axis=0)
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True, False,  True],
       [False,  True, False],
       [ True,  True,  True],
       [False, False,  True],
       [ True,  True,  True]])

En bref, de quoi il s'agit fait est qu'il construit une matrice booléenne pour chaque note dans possibleGrades , puis agrège tout le résultat.


0 commentaires