J'ai un vecteur dogSpecies montrant les quatre espèces de chiens uniques à l'étude.
for i in range(np.size(data, axis = 0)):
# validation of the species
if (data[i] != dogSpecies):
errorEval[i] = False
J'ai aussi un vecteur data contenant un entier numéros correspondant aux enregistrements d'espèces de chiens de tous les chiens testés.
errorEval = np.array[True, True, True, False, False, True, True, False, True]
Certains des enregistrements dans data contiennent des valeurs différentes de 1,2,3 ou 4. (comme -1, 0 ou 5). Si un élément de l'ensemble data n'est égal à aucun élément de dogSpecies , cette occurrence doit être marquée dans une matrice booléenne d'évaluation des erreurs comme False code >.
#initially all the elements of the boolean error evaluation vector are True. errorEval = np.ones((np.size(data,axis = 0)),dtype=bool)
Idéalement, mon vecteur errorEval ressemblerait à ceci:
# species of examined dogs data = np.array(1,1,2,-1,0,2,3,5,4)
Je veux un morceau de code qui vérifie si les éléments de data ne sont pas égaux aux éléments du vecteur dogSpecies . Mon code pour une raison quelconque marque chaque élément du vecteur errorEval comme "False".
#a set of possible dog species dogSpecies = [1,2,3,4]
Je comprends que je ne peux pas comparer un seul élément avec un vecteur de quatre éléments comme ci-dessus, mais comment puis-je faire cela alors?
3 Réponses :
N'est-ce pas ce que vous voulez?
for index, elem in enumerate(data):
if elem not in dogSpecies:
errorEval[index] = False
Probablement pas très rapide, il n'utilise pas d'ufuncs numpy vectorisés mais si le tableau n'est pas très grand, ce ne sera pas le cas matière. La conversion de dogSpecies en un ensemble accélérera également les choses.
En passant, votre python a l'air très c / java esque. Je vous suggère de lire le guide de style python .
si OP clarifie, une meilleure approche plus efficace serait d'utiliser uniquement les fonctions pandas et de les convertir en tableau comme étape finale, de cette façon, il est vectorisé
Si je comprends bien, vous avez un dataframe et une liste d'espèces de chiens. Cela devrait réaliser ce que vous voulez.
df.assign(errorEval=df['dog'].isin(dogSpecies).astype(int)).errorEval.values # array([1, 1, 1, 0, 1, 1, 0, 0, 0])
Si vous ne voulez pas créer de nouvelle colonne, vous pouvez faire:
df = pd.DataFrame({'dog': [1,3,4,5,1,1,8,9,0]})
dog
0 1
1 3
2 4
3 5
4 1
5 1
6 8
7 9
8 0
df['errorEval'] = df['dog'].isin(dogSpecies).astype(int)
dog errorEval
0 1 1
1 3 1
2 4 1
3 5 0
4 1 1
5 1 1
6 8 0
7 9 0
8 0 0
df.errorEval.values
# array([1, 1, 1, 0, 1, 1, 0, 0, 0])
C'est ce que je veux réaliser, oui. Je voudrais juste l'avoir immédiatement dans un vecteur séparé et non dans le bloc de données. Merci quand même!
vous n'avez pas besoin de le définir dans le dataframe, voir ma réponse mise à jour
Comme @FHTMitchel l'a indiqué, vous devez utiliser dans pour vérifier si un élément est dans une liste ou non.
Mais vous pouvez utiliser la compréhension de liste qui est plus rapide qu'une boucle normale et plus courte:
errorEval = np.array([True if elem in dogSpecies else False for elem in data])
vous voulez donc une colonne indiquant si la valeur de la colonne dog existe dans votre liste
dogSpecies, est-ce que je comprends bien?En ce moment, vous vérifiez si un élément de données (je suppose que
int) n'est pas égal à uneliste, qui sera toujours évaluée commeFalse code >Il est toujours utile de fournir un exemple minimal des données / entrées et du résultat attendu. Veuillez lire exemple minimal reproductible
En passant, vous pouvez obtenir un tableau numpy à partir d'une colonne DataFrame en utilisant son
valeursattribut:df.iloc [:, 3] .values