问题描述
我有一个带有负值和正值的 numpy 数组,我试图将它提高到 1/3 的幂。对于所有负数,我得到 missing_zero = "0"
df['ZIP'] = missing_zero + df['ZIP'].map(str)
(我理解这是因为它涉及复根),但是,我想打印出实根而不是 Nan
。
有没有一种快速的pythonic方法来做到这一点?因为第三个根,我知道总会有一个真正的根。
Nan
import numpy as np
x = np.linspace(-5,5,10)
z = x**(1/3)
的结果是:
z
我希望 array([ nan,nan,0.82207069,1.1856311,1.40572111,1.57256466,1.70997595])
包含不带 z
的操作的所有实根。
解决方法
您需要 numpy
的 cbrt
函数:
>>> 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))