J'essaye de supprimer le dernier élément d'un tableau, si l'élément ne remplit pas certaines conditions. Le code que j'utilise est:
# Set the distibution parameter to 2 a = 2 # Set the size to 100 s = 100 # Create Zipf's Law distribution using a and s x = np.random.zipf(a,s) # Reorder list by number frequency xb = np.unique(x, return_counts=True) print("X",x) print("XB",xb) for i in reversed(xb): if xb[-1] > xb[-2]*1.5: xb = np.delete(xb,-1) print("XB mod",xb) print()
J'obtiens la sortie suivante pour python print ("X", x)
et `` `` python print (" XB ", xb):
XB (tableau ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 29, 31, 33, 56, 225]), tableau ([57, 17, 4, 4, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1], dtype = int64))
Cependant, lorsque j'essaie d'exécuter la partie suppression du code, j'obtiens l'erreur suivante:
Traceback (dernier appel le plus récent): fichier "test2.py", ligne 22, dans if xb [-1]> xb [-2] * 1.5: ValueError: La valeur de vérité d'un tableau avec plus d'un élément est ambiguë. Utilisez a.any () ou a.all ()
Avez-vous une idée de comment le réparer, afin que je puisse supprimer le dernier élément du tableau XB, s'il ne remplit pas la condition?
3 Réponses :
Réponse courte:
Utilisez all
:
array([ True, True, False, False, False, False, False, False, False, False, False, False, False])
Équivalent: if (xb [ -1]> xb [-2] * 1.5) .all ():
Réponse longue:
Vous avez :
xb (array([ 1, 2, 3, 4, 5, 7, 9, 10, 13, 21, 22, 24, 30]), array([62, 16, 2, 4, 6, 3, 1, 1, 1, 1, 1, 1, 1]))
qui est une liste de tableaux numpy.
Ensuite, xb [-1]> xb [-2] * 1.5 renvoie:
for i in reversed(xb): if all(xb[-1] > xb[-2]*1.5): # use all here xb = np.delete(xb,-1)
Si vous n'utilisez pas tout
OU aucun
, cette condition déclenchera l'erreur
le problème est dans if xb [-1]> xb [-2] * 1.5
xb n'est pas un scalaire mais un vecteur (tableau 1d).
Alors qu'est-ce que cela signifie v1> v2? tous les articles? au moins un élément?
Prenons par exemple [2,3]> [1,4], all renverra False car 3> 4, est False, any d'autre part, renverra True car il y en a au moins un qui est vrai (2> 1).
Comme l'erreur, dites que c'est ambigu .
Donc, si par exemple vous voulez que tous les éléments passent la condition que vous devez utiliser:
if np.all(xb[-1] > xb[-2]*1.5): ...
Pourriez-vous développer la réponse, car j'ai du mal à suivre la logique. La réponse semble correcte, mais pas la raison.
exemple ajouté. J'espère que cela aide Je n'ai aucune idée de pourquoi j'ai été voté à la baisse.
xb
est un tuple composé d'une paire d'objets np.ndarray
.
Comment supprimer le dernier élément du tableau XB, s'il ne remplit pas la condition
Si vous souhaitez supprimer la dernière paire de valeurs zippées (par exemple 225
et 1
pour vos données) en fonction de votre condition où vous comparez la dernière deux nombres de la première ligne de données (par exemple 225> 56 * 1.5
pour vos données):
if xb[0][-1] > xb[0][-2] * 1.5: xb = tuple(x[:-1] for x in xb) >>> xb (array([ 1, 2, ..., 31, 33, 56]), array([57, 17, ..., 1, 1, 1]))
laissez-moi savoir si ma réponse aide
Ca a du sens. Soulève d'autres problèmes, mais ceux que je peux résoudre. Merci. Acceptera dans quelques minutes
génial. envisagez d'accepter ma réponse. à votre santé
En général, ne modifiez pas un objet (
xb
) pendant que vous l'itérez.Quel est votre résultat attendu? Et que voulez-vous que
if xb [-1]> xb [-2] * 1.5
fasse?225> 56 * 1,5
?@Alexandre; c'est correct. Si l'élément x + 1 est 50% supérieur à x, supprimez l'élément x + 1