В Python, (-1000)**(1/3.)
возвращает комплексное число,
>>> (-1000)**(1/3.)
(5+8.660254037844384j)
Это происходит потому, что, как компьютер хранит номера, 1/3 = 0.33333...
- это иррациональное число, которое в какой-то момент становится приближенным, и поэтому существуетпотеря точности
>>> a = np.arange(10)**3
>>> a[:6:2] = -1000
>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512,
729], dtype=int32)
>>> for i in a:
print((i)**(1/3.))
nan
1.0
nan
3.0
nan
4.999999999999999
5.999999999999999
6.999999999999999
7.999999999999999
8.999999999999998
Здесь значения в ndarray a
имеют тип numpy.int32
.
Код (i)**(1/3.)
возвращает результат типа numpy.float64
, начиная со второгоаргумент является плавающей точкой.
>>> [type((i)**(1/3.)) for i in a]
[<class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>, <class 'numpy.float64'>]
(-1000)**(1/3.)
является комплексным числом и не может быть сохранен как numpy.float64
, поэтому nan
Чтобы избежать nan
Вы можете изменить dtype
из ndarray
на numpy.complex
и выполнить вычисления
>>> b = a.astype(np.complex)
>>> b
array([-1000.+0.j, 1.+0.j, -1000.+0.j, 27.+0.j, -1000.+0.j,
125.+0.j, 216.+0.j, 343.+0.j, 512.+0.j, 729.+0.j])
>>> for i in b:
print((i)**(1/3.))
(4.999999999999999+8.660254037844384j)
(1+0j)
(4.999999999999999+8.660254037844384j)
(3+0j)
(4.999999999999999+8.660254037844384j)
(4.999999999999999+0j)
(5.999999999999999+0j)
(6.999999999999999+0j)
(7.999999999999999+0j)
(8.999999999999998+0j)
Вы можете взять абсолютные значения этих чисел, используя abs()
>>> for i in b:
print(round(abs((i)**(1/3.))))
10.0
1.0
10.0
3.0
10.0
5.0
6.0
7.0
8.0
9.0