numpy数组中负数的立方根将返回nan

时间:2018-10-22 08:55:53

标签: python numpy

摘自Numpy文档:

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
>>> a[ : :-1]                                 # reversed a
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])
>>> for i in a:
...     print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

有人可以向我解释最后一行代码吗? i to the power of 1/3如何等于这些数字?

例如-1000^1/3 = nan?我跳过了什么部分?

3 个答案:

答案 0 :(得分:3)

在numpy中有一个内置函数来查找cuberoot。 检查一下:

[-10.   1. -10.   3. -10.   5.   6.   7.   8.   9.]

您的输出将是:

boost::stream

答案 1 :(得分:1)

在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的{​​{1}}更改为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()

答案 2 :(得分:0)

  

i to the power of 1/3如何等于这些数字?

这不仅是NumPy或特定于Python的功能。是数学的(在您的示例中,它通过覆盖__pow__而不是Python来处理数学运算,但它也适用于纯Python数字。)

>>> 2 ** 5  # 2 raised to 5
32
>>> 32 ** (1/5)  # 5th root of 32
2.0

x ** y(或“ x升至y”),“ y”可以是:

  • x ** 2:“ x平方”
  • x ** 3:“ x立方”
  • x ** 5:“ x升至5”或“ x的5次方”

也可以是一个分数:

  • x **(1/2):“ x的平方根”
  • x **(1/3):“ x的立方根”
  • x **(1/5):“ x的第5个根”

这里是source which explains it better

  

Sqrt进程实际上取消了2的幂的加法;换句话说,从某种意义上讲,这是平方的“相反”过程。回想一下我们关于幂的代数规则,可以将幂的个数再次提高为幂,而我们要做的就是将幂相乘。然后请注意,平方根过程可以写成提高到½的幂:

     

Sqrt(2²)=(2²)½=2²×½= 2 ^ 1 = 2

还有一个更数学的证明:Why Is an Exponent of 1/2 the Same as a Square Root?