我有一个负值的数组,必须在Python中提升到分数幂。我需要获取操作生成的复数数组的实部。
MWE
from __future__ import division
import numpy as np
a = -10
b = 2.5
n = 0.88
x = np.arange(5, 11, 1)
y = (a / (x - b)) ** (1 / n)
我正在使用Python v2.7.6。
答案 0 :(得分:1)
当您使用numpy
时,您可以使用np.power
,如下所示:
from __future__ import division
import numpy as np
a = -10+0j
b = 2.5
n = 0.88
x = np.arange(5, 11, 1)
y = np.power((a / (x - b)),(1 / n))
然而,numpy数组的实际**
只是ndarray的语法糖。 pow ()并且将导致执行与np.power
相同的代码。请参阅@ acjr的评论。
答案 1 :(得分:1)
问题是NumPy不会将浮点数或整数dtypes提升为复数dtypes进行此计算。
你有一个浮点数组和浮点数指数,所以NumPy尝试使用“将两个浮动dtype对象放入,得到一个浮动dtype对象”循环来计算结果。负值触发警告并返回空值数组。
当其中一个操作数是数组时, **
最终使用与np.power
相同的代码。您可以看到下面可以使用的所有低级循环。请注意,您始终返回与输入dtypes具有相同dtype的对象:
>>> np.power.types
['bb->b', # char
'BB->B', # unsigned char
'hh->h', # short
...
'dd->d', # compatible Python float
'gg->g', # compatible: C long float
'FF->F',
'DD->D', # compatible: Python complex
'GG->G',
'OO->O']
我们希望计算与'DD->D'
循环一起运行!
正如本页其他人所指出的,解决方案是确保base或exponent具有复杂的dtype。这迫使NumPy将任何较小的数字dtypes提升为复杂的dtype,并且计算使用“将两个复杂的dtype对象放入,得到一个复杂的dtype对象”循环:
>>> a = -10 + 0j # ensures that a/(x - b) will have complex dtype
>>> ((a / (x - b)) ** (1 / n))
array([-4.39566725-2.00743397j, -2.99895689-1.36957772j,
-2.25394034-1.02934006j, -1.79435400-0.81945401j,
-1.48410349-0.67776735j, -1.26136729-0.57604714j])
如果您只想使用((a / (x - b)) ** (1 / n)).real
。