如何在Python中将具有负值的数组提升为分数幂?

时间:2016-01-20 11:34:37

标签: python arrays numpy complex-numbers

我有一个负值的数组,必须在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。

2 个答案:

答案 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