1
votes

Impossible de supprimer l'élément dans ndarray

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?


6 commentaires

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


3 Réponses :


1
votes

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


0 commentaires

-2
votes

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): ...


2 commentaires

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.



2
votes

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]))


0 commentaires