2011-12-15 6 views
7

Могу ли я узнать, почему ndarray разрешает доступ к индексу с плавающей запятой, и что это значит?Почему 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 
>>> 
+0

Это не работает больше. См. Http://stackoverflow.com/a/43305317/2898712 – wedi

ответ

5

Это может быть полезно, и мне интересно, почему другие классы не делают это так, как это делает 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. ]]) 
+1

Я согласен, и я использую его очень точно по причинам, которые вы описали. Тем не менее, мантра python «явно лучше, чем неявная», поэтому, чтобы быть справедливым, вероятно, поэтому большинство других объектов python этого не делают. Несмотря ни на что, это, безусловно, проклятие! –

3

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

например.

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

print x[1.9] 
print x[2.1] 

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

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

print x[[1.2, 3.4]] 
3

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

2

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

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

Индексирование с поплавками поднимет IndexError, например, [0, 0.0]. (See 1.11 release notes)

Индексирование с поплавками повышает IndexError, например, [0, 0.0]. (See 1.12 release notes)

(курсив мой)

Смежные вопросы