np.roots()导致' float()参数必须是字符串或数字'与mp.mpc类型的问题

时间:2017-06-04 01:00:21

标签: python numpy mpmath

我收到了这个错误:

  

float()参数必须是字符串或数字

那么,为什么会发生这种情况?(我尝试过像np.asarray()这样的命令,但它仍然失败)。

mp.mpc(cmath.rect(A,B)))

1 个答案:

答案 0 :(得分:0)

raizes中的项目实际上是mpmath.mpc个实例,而不是本机Python复杂浮点数。 numpy不知道如何处理mpmath类型,因此TypeError

你原来的问题中根本没有提到mpmath。如果您发布完整的追溯,而不是在最后切断最重要的部分,问题仍然很容易诊断出来:

In [10]: np.roots(Q)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-f3a270c7e8c0> in <module>()
----> 1 np.roots(Q)

/home/alistair/.venvs/mpmath/lib/python3.6/site-packages/numpy/lib/polynomial.py in roots(p)
    220     # casting: if incoming array isn't floating point, make it floating point.
    221     if not issubclass(p.dtype.type, (NX.floating, NX.complexfloating)):
--> 222         p = p.astype(float)
    223
    224     N = len(p)

TypeError: float() argument must be a string or a number, not 'mpc'

每当您在本网站上寻求调试帮助时,请始终发布整个追溯,而不是仅发布最后一行(部分) - 它包含大量有助于诊断的信息问题。

解决方案很简单 - 只是不要将cmath.rect返回的本地Python复杂浮点数转换为mpmath.mpc复杂的浮点数:

raizes = []
for i in range(2*n):
   a, f = cmath.polar(l[i])
   if((f>np.pi/2) or (f<-np.pi/2)):
        raizes.append(cmath.rect(a*r,f))

Q = np.poly(raizes)

print(np.roots(Q))

# [-0.35372430 +1.08865146e+00j -0.92606224 +6.72823602e-01j
#  -0.35372430 -1.08865146e+00j -1.14467588 -9.11902316e-16j
#  -0.92606224 -6.72823602e-01j]