Почему ndarray разрешает индекс с плавающей точкой - PullRequest
8 голосов
/ 15 декабря 2011

Могу ли я знать, почему ndarray разрешает доступ к индексам с плавающей запятой, и что это значит?

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

Ответы [ 4 ]

6 голосов
/ 09 апреля 2017

Использование индекса с плавающей запятой в ndarray больше не допускается и выдает ошибку начиная с версии 1.12.

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

Индексирование с помощью чисел с плавающей запятой вызовет IndexError, например, [0, 0,0].( См. Примечания к выпуску 1.11 )

Индексация с помощью чисел с плавающей запятой повышает IndexError, например, [0, 0,0].( См. Примечания к выпуску 1.12 )

(мой акцент)

5 голосов
/ 15 декабря 2011

Это может быть полезно, и мне интересно, почему другие классы не делают это так, как это делает numpy.

Один особенно полезный момент, когда я заметил, что это, если ваш numpyмассив является изображением, и у вас есть обработчик событий для щелчков мыши, который дает вам event.xdata и event.ydata в виде чисел с плавающей запятой, тогда вы все равно можете получить интересующую область, используя срезы, без необходимости преобразования их в пиксельные координаты.Например, предположим, что вы обрезали изображение или увеличивали его, щелкая и перетаскивая выделение - положение мыши на изображении обычно будет соответствовать субпиксельным координатам, за исключением специального случая, когда изображение отображается в масштабе 1: 1.

В качестве примечания, не целочисленные обозначения срезов (даже комплексные числа в срезах) могут использоваться в их классах трюков индекса r_ и c_, например:

>>>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.  ]])
3 голосов
/ 15 декабря 2011

Мне не удалось отследить его в источнике, но, глядя на документацию, в этом случае передается объект среза (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html), и похоже, что входные данные преобразуются как ints на нудистской стороне вещей.

3 голосов
/ 15 декабря 2011

Как правило, для массивов с номерами, int вызывается на любом входе, который не является целым числом. Другими словами, это округляется. 1.999 урожайность 1 и т. Д.

, например

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

print x[1.9]
print x[2.1]

(Обратите внимание, что это то же самое, что и x[1] и x[2] соответственно.)

Это также относится к спискам или массивам, используемым в качестве индикаторов:

print x[[1.2, 3.4]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...