仅从 numpy 中的分数幂计算实根
Calculate only real roots from fractional power in numpy
我有一个带有负值和正值的 numpy 数组,我正在尝试将其提高到 1/3 的幂。我得到所有负数的 Nan
(我理解是因为它涉及复根),但是,我想打印出实根而不是 Nan
。
有没有一种快速的 pythonic 方法来做到这一点?因为第三个根,我知道总会有一个真正的根。
import numpy as np
x = np.linspace(-5,5,10)
z = x**(1/3)
z
的结果是:
array([ nan, nan, nan, nan, nan,
0.82207069, 1.1856311 , 1.40572111, 1.57256466, 1.70997595])
我希望 z
包含没有 nan
的运算的所有实根。
您需要 cbrt
来自 numpy
的功能:
>>> np.cbrt(x)
array([-1.70997595, -1.57256466, -1.40572111, -1.1856311 , -0.82207069,
0.82207069, 1.1856311 , 1.40572111, 1.57256466, 1.70997595])
您可以使用complex
数据类型,然后提取真正的组件:
import numpy
x = numpy.linspace(-5, 5, 10, dtype=numpy.complex)
roots = x ** 1/3
reals = roots.real
print(reals)
array([-1.66666667+0.j, -1.2962963 +0.j, -0.92592593+0.j, -0.55555556+0.j,
-0.18518519+0.j, 0.18518519+0.j, 0.55555556+0.j, 0.92592593+0.j,
1.2962963 +0.j, 1.66666667+0.j])
你可以使用这样的技巧:
z = np.where(x<0, -np.abs(x)**(1/3), x**(1/3))
我有一个带有负值和正值的 numpy 数组,我正在尝试将其提高到 1/3 的幂。我得到所有负数的 Nan
(我理解是因为它涉及复根),但是,我想打印出实根而不是 Nan
。
有没有一种快速的 pythonic 方法来做到这一点?因为第三个根,我知道总会有一个真正的根。
import numpy as np
x = np.linspace(-5,5,10)
z = x**(1/3)
z
的结果是:
array([ nan, nan, nan, nan, nan,
0.82207069, 1.1856311 , 1.40572111, 1.57256466, 1.70997595])
我希望 z
包含没有 nan
的运算的所有实根。
您需要 cbrt
来自 numpy
的功能:
>>> np.cbrt(x)
array([-1.70997595, -1.57256466, -1.40572111, -1.1856311 , -0.82207069,
0.82207069, 1.1856311 , 1.40572111, 1.57256466, 1.70997595])
您可以使用complex
数据类型,然后提取真正的组件:
import numpy
x = numpy.linspace(-5, 5, 10, dtype=numpy.complex)
roots = x ** 1/3
reals = roots.real
print(reals)
array([-1.66666667+0.j, -1.2962963 +0.j, -0.92592593+0.j, -0.55555556+0.j,
-0.18518519+0.j, 0.18518519+0.j, 0.55555556+0.j, 0.92592593+0.j,
1.2962963 +0.j, 1.66666667+0.j])
你可以使用这样的技巧:
z = np.where(x<0, -np.abs(x)**(1/3), x**(1/3))