摘自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
?我跳过了什么部分?
答案 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”可以是:
也可以是一个分数:
这里是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?