2010-12-04 39 views
2

J'utilise le code suivant pour numériser un tableau dans 16 bacs:numpy.digitize renvoie des valeurs hors limites?

numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1]) 

Je pense que la sortie est dans l'intervalle [1, 16], car il y a 16 bacs. Cependant, l'une des valeurs du tableau retourné est 17. Comment cela peut-il être expliqué?

Répondre

5

Ceci est en fait documenté le comportement de numpy.digitize():

Chaque indice i retourné est telle que bins[i-1] <= x < bins[i] si bins augmente de façon monotone, ou si bins[i-1] > x >= bins[i] bins est décroissante de façon monotone. Si les valeurs dans x dépassent les limites de bins, 0 ou len(bins) est renvoyé comme approprié.

Donc, dans votre cas, 0 et 17 sont également des valeurs de retour valides (notez que le tableau bin retourné par numpy.histogram() a une longueur 17). Les bacs retournés par numpy.histogram() couvrent la plage array.min() à array.max(). La condition donnée dans les docs montre que array.min() appartient au premier casier, alors que array.max() se situe en dehors du dernier casier - c'est pourquoi 0 n'est pas dans la sortie, alors que 17 l'est.

+0

Hmm, je ne sais à propos de le comportement de la casse de digitize(). Cependant, puisque j'utilise histogram() pour créer les bins, toutes les valeurs ne sont-elles pas censées se trouver dans les bins? – sandesh247

+0

Comme je l'ai expliqué dans ma réponse, 'array.min()' est supposé se trouver dans le premier casier parce qu'il satisfait la condition 'bins [0] <= array.min()

+0

Merci pour votre patience. Le comportement de l'argument 'bins' pour' numpy.histogram' est différent (le dernier intervalle est un intervalle fermé), ce qui a conduit à la confusion. – sandesh247

2

numpy.histogram() produit un tableau de la corbeille bords, dont il existe (number of bins)+1.

1

En numpy version 1.8., Vous avez la possibilité de choisir si vous souhaitez que numpy.digitize considère l'intervalle à fermer ou à ouvrir. Voici un exemple (copié à partir de http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html)

x = np.array ([1,2, 10,0, 12,4, 15,5, 20])

bacs = np.array ([0,5,10, 15,20])

np.digitize (x, bacs, droite = True)

tableau

([1, 2, 3, 4, 4])