Numpy dtype = int - PullRequest
       42

Numpy dtype = int

4 голосов
/ 27 апреля 2019

В приведенном ниже коде. Я получаю ожидаемые результаты x1

import numpy as np 
x1 = np.arange(0.5, 10.4, 0.8)
print(x1)
[ 0.5  1.3  2.1  2.9  3.7  4.5  5.3  6.1  6.9  7.7  8.5  9.3 10.1]

Но в коде ниже, когда я устанавливаю dtype = int, почему результат x2 не [ 0 1 2 2 3 4 5 6 6 7 8 9 10], а вместо этого яполучить значение x2 как [ 0 1 2 3 4 5 6 7 8 9 10 11 12], где последнее значение 12 превышает конечное значение 10.4. Пожалуйста, разъясните мою концепцию относительно этого.

import numpy as np 
x2 = np.arange(0.5, 10.4, 0.8, dtype=int)
print(x2)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12]

1 Ответ

4 голосов
/ 27 апреля 2019

По документам: https://docs.scipy.org/doc/numpy1.15.0/reference/generated/numpy.arange.html

стоп: номер Конец интервала Интервал не включает это значение, за исключением некоторых случаев, когда шаг не является целым числом, а округление с плавающей запятой влияет на длину out.

arange: ndarray Массив равномерно распределенных значений.
Для аргументов с плавающей запятой длина результата равна ceil ((стоп - старт) / шаг). Из-за переполнения с плавающей запятой это правило может привести к тому, что последний элемент out будет больше стопа.

Так что здесь последний элемент будет.

In [33]: np.ceil((10.4-0.5)/0.8)                                                
Out[33]: 13.0

Следовательно, мы видим перерегулирование на 12 в случае np.arange(0.5, 10.4, 0.8, dtype=int), поскольку stop=13 в вышеприведенном случае и значение по умолчанию равно 0,

отсюда и результат, который мы наблюдаем.

In [35]: np.arange(0.5, 10.4, 0.8, dtype=int)                                   
Out[35]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

Следовательно, лучший способ генерации целочисленных диапазонов - использовать целочисленные параметры, например, так:

In [25]: np.arange(0, 11, 1)                                                    
Out[25]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
...