我想计算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])
答案 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
或 x^(1/3) 其中定义域全为 R,但函数符号对 x<0
为负x = np.linspace(-10, 10, 1000)
plt.plot(x, r_pow(x, 2, 3));
或 x^(1/6) 其中实域为 [0, +∞)
x = np.linspace(-10, 10, 1000)
plt.plot(x, r_pow(x, 1, 3));