numpy 使用基于i的对数时,“TypeError:只有长度为1的数组才能转换为Python标量”

dwbf0jvd  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(135)

我正在尝试为函数logi(X)(一个基于i的日志)绘制matplotlib图。以下是我的代码:

from pylab import *
import cmath

x = linspace(-8,8,500)
z = cmath.log(x,1j)

plot(x,real(z),label='real')
plot(x,imag(z),label='imag')
legend()

show()

问题是它抛出了TypeError: only length-1 arrays can be converted to Python scalars
我搜索了一下,找到了类似TypeError: only length-1 arrays can be converted to Python scalars while trying to exponentially fit data的答案:
像math.abs()或math.log10()这样的非NumPy函数不能很好地处理NumPy数组。
还有一些建议,建议改用Numpy的log()函数。不幸的是,Numpy不支持以i为基础的对数,所以我被迫使用cath。我怎么才能修好它?

egdjgwm8

egdjgwm81#

如果数组具有复杂数据类型,则np.log将返回复杂结果:

In [58]: x = np.linspace(-8,8,11).astype(complex)    
In [59]: x
Out[59]: 
array([-8. +0.j, -6.4+0.j, -4.8+0.j, -3.2+0.j, -1.6+0.j,  0. +0.j,
        1.6+0.j,  3.2+0.j,  4.8+0.j,  6.4+0.j,  8. +0.j])

In [60]: np.log(x)
C:\Users\paul\AppData\Local\Temp\ipykernel_7972\1277889159.py:1: RuntimeWarning: divide by zero encountered in log
  np.log(x)
Out[60]: 
array([2.07944154+3.14159265j, 1.85629799+3.14159265j,
       1.56861592+3.14159265j, 1.16315081+3.14159265j,
       0.47000363+3.14159265j,       -inf+0.j        ,
       0.47000363+0.j        , 1.16315081+0.j        ,
       1.56861592+0.j        , 1.85629799+0.j        ,
       2.07944154+0.j        ])

在-8点:

In [61]: np.log(x[0])
Out[61]: (2.0794415416798357+3.141592653589793j)

我们可以用以下标准移动基数:

In [62]: np.log(x[0])/np.log(1j)
Out[62]: (2-1.3238136009159096j)

将其与cmath结果进行比较:

In [63]: cmath.log(-8, 1j)
Out[63]: (2-1.3238136009159096j)

因此,要么为数组的每个元素迭代并调用cmath.log,要么使用这个复杂的数组和基移位。

相关问题