Numpy第n个奇数根,包括负值

时间:2018-05-23 14:44:23

标签: python numpy scipy

我想计算python中某些数字的第n个奇数根。 Numpy作为立方根函数。使用该函数我可以计算x ^(1/3)。

x = np.linspace(-100,100,100)
np.cbrt(x)
>>> array([-4.64158883, -4.26859722, -3.81571414, -3.21829795, -2.23144317,
    2.23144317,  3.21829795,  3.81571414,  4.26859722,  4.64158883])

然而,如果我想以直接的方式为其他第k个奇数根计算相同的东西,我有点卡住了。我不能直接使用np.power,甚至不能计算立方根:

np.power(x,1./3)
>>> array([       nan,        nan,        nan,        nan,        nan,
   2.23144317, 3.21829795, 3.81571414, 4.26859722, 4.64158883])

(-100.)**(1./3)
>>> ValueError: negative number cannot be raised to a fractional power

我可以计算x的绝对值的第k个奇数根,然后根据x中的负数条目相应地改变符号,但我想知道是否有更简单的方法。这是我目前的解决方案:

def kth_root(x,k):
    if k % 2 != 0:
        res = np.power(np.abs(x),1./k)
        return res*np.sign(x)
    else:
        return np.power(np.abs(x),1./k)

kth_root(x,3)
>>> array([-4.64158883, -4.26859722, -3.81571414, -3.21829795, -2.23144317,
    2.23144317,  3.21829795,  3.81571414,  4.26859722,  4.64158883])

2 个答案:

答案 0 :(得分:0)

我将用我当前的解决方案回答我自己的问题。这并不是说没有更容易或更快的方法存在。

def kth_root(x,k):
    if k % 2 != 0:
        res = np.power(np.abs(x),1./k)
        return res*np.sign(x)
    else:
        return np.power(np.abs(x),1./k)


x = np.linspace(-100,100,100)
kth_root(x,3)
>>> array([-4.64158883, -4.26859722, -3.81571414, -3.21829795, -2.23144317,
2.23144317,  3.21829795,  3.81571414,  4.26859722,  4.64158883])

答案 1 :(得分:0)

我遇到了类似的问题,从你开始,$variableone = 'This'; $variabletwo = 'Place'; $variableone = "$variableone $variabletwo"; $variabletwo = " "; 定义了一个函数来计算 def 到具有正确实域的有理指数 x 的幂。

n/d

因此,例如,我们可以有 x^(2/3),其中定义域全为 R,函数符号始终为正(因为 x^2 始终为正)

def r_pow(x, n, d):
    """
    Compute x to the power of n/d (not reduced to lowest
    expression) with the correct function real domains.
    
    ARGS:
        x (int,float,array): base
        n (int)            : exponent numerator
        d (int)            : exponent denominator
        
    RETURNS:
        x to the power of n/d
    """
    
    # list to array
    if type(x) == list:
        x = np.array(x)
    # check inputs
    if type(n) != int or type(d) != int:
        raise Exception("Exponent numerator and denominator must be integers")
    # if denominator is zero
    if not d:
        raise Exception("Exponent denominator cannot be 0")
        
    # raise x to power of n
    X = x**n
    # even denominator
    if not d % 2:
        # domain is for X>=0 only
        if type(x) == np.ndarray:
            X[X<0] = np.nan
        elif X < 0:
            X = np.nan
        res = np.power(X, 1./d)
        return res
    # odd denominator
    else:
        # domain is all R
        res = np.power(np.abs(X), 1./d)
        res *= np.sign(X)
        return res

enter image description here

或 x^(1/3) 其中定义域全为 R,但函数符号对 x<0

为负
x = np.linspace(-10, 10, 1000)
plt.plot(x, r_pow(x, 2, 3));

enter image description here

或 x^(1/6) 其中实域为 [0, +∞)

x = np.linspace(-10, 10, 1000)
plt.plot(x, r_pow(x, 1, 3));

enter image description here