11 votes

Pourquoi ndarray permet un index à virgule flottante

Puis-je savoir pourquoi ndarray permet l'accès aux index en virgule flottante, et ce que cela signifie ?

>>> wk1 = numpy.arange(10)
>>> wk1[1:2.8]
array([1])
>>> wk1 = [1,2,3,4,5,6,7,8,9,10]
>>> wk1[1:2.8]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
>>>

6voto

wedi Points 812

L'utilisation d'un index à virgule flottante dans un tableau ndarray n'est plus autorisée et provoque une erreur à partir de la version 1.12.

IndexError: only integers, slices (`:`), ellipsis (`...`),
    numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Indexation avec des flottants soulèvera IndexError, par exemple, a[0, 0.0]. ( Voir les notes de version 1.11 )

Indexation avec des flottants soulève IndexError, par exemple, a[0, 0.0]. ( Voir les notes de publication de la version 1.12 )

(c'est moi qui souligne)

5voto

wim Points 35274

Cela peut être utile, et je me demande pourquoi d'autres classes Ne le fais pas. le faire de la manière dont numpy le fait.

Un cas particulièrement utile où j'ai remarqué cela est celui où votre tableau numpy est une image, et où vous avez un gestionnaire d'événements pour les clics de souris qui vous donnent event.xdata y event.ydata en tant que flottants, vous pouvez toujours obtenir une région d'intérêt en utilisant les tranches sans avoir à les convertir en coordonnées de pixels. Par exemple, supposons que vous recadriez une image ou que vous fassiez un zoom sur une image en cliquant et en faisant glisser une sélection - la position de la souris dans l'image se fera généralement sur des coordonnées inférieures au pixel, sauf dans le cas particulier où l'image est affichée à l'échelle 1:1.

À titre d'information, la notation des tranches non entières (même les nombres complexes en tranches) peut être utilisée dans leurs classes d'indexage r_ y c_ par exemple :

>>>np.r_[0:3:0.1]
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
        1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,
        2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9])

>>>np.c_[-1:1:9j]
array([[-1.  ],
       [-0.75],
       [-0.5 ],
       [-0.25],
       [ 0.  ],
       [ 0.25],
       [ 0.5 ],
       [ 0.75],
       [ 1.  ]])

3voto

Joe Kington Points 68089

Fondamentalement, pour les tableaux numpy, int est appelé sur toute entrée qui n'est pas déjà un entier. En d'autres termes, il arrondit à l'inférieur. 1.999 donne 1 etc.

par exemple

import numpy as np
x = np.arange(10)

print x[1.9]
print x[2.1]

(Notez que c'est la même chose que x[1] y x[2] respectivement).

Cela s'applique également aux listes ou aux tableaux utilisés comme indicateurs :

print x[[1.2, 3.4]]

3voto

JoshAdel Points 15911

Je n'ai pas été capable de le retrouver dans la source, mais en regardant la documentation, ce qui est passé dans ce cas est un objet de tranche ( http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html ), et il semble que les entrées soient exprimées en tant que ints sur le côté numpy des choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X