我有以下问题。我想评估以下功能
def sigLinZ(self,val,omega):
A = 1
C = 0
D = 1
B =1./(omega*val*1j)
return np.asmatrix(np.array([[A,B],[C,D]]))
这样我就可以这样的方式在pyplot中使用它:
omega = numpy.arange(0,100,1)
y = classInstance.sigLinZ(12,omega)
plt.plot(omega,y)
但这不起作用。 Python说:
Traceback (most recent call last):
File "testImpedanz.py", line 132, in test6_lineImpedanz
print "neue Matrix: ", lineImpe.sigLinZ('C',lineImpe.C(),np.array([600e6,300e6]))
File "/afs/physnet.uni-hamburg.de/users/ap_h/pgwozdz/Dokumente/PythonSkriptsPHD/ImpedanzCalculation.py", line 350, in sigLinZ
return np.mat(np.array([[A,B],[C,D]]))
TypeError: only length-1 arrays can be converted to Python scalars
我知道numpy函数这个程序运行得很好但是对于我的函数它根本不起作用。
答案 0 :(得分:3)
您正在尝试将数组插入到您传递给方法的omega
定义中的矩阵元素中。您需要迭代omega
将每个元素分别传递给sigLinZ
,或者您需要重新编写sigLinZ
来处理数组并返回类似矩阵或3D数组列表的内容。
答案 1 :(得分:1)
首先,问题与pylab无关,只是与numpy相关。它失败了:
return np.asmatrix(np.array([[A,B],[C,D]]))
实际上在这里失败了
np.array([[A,B],[C,D]])
可以从错误消息和对象的形状确定其不起作用的原因。当您传递omega
形状为
print omega
>>> (100,)
并尝试将其放入大小为2x2
的对象中,[[A,B],[C,D]]
它确实会抱怨
TypeError: only length-1 arrays can be converted to Python scalars
您是否打算从函数sigLinZ
返回标量值?我推断,因为你试图用结果做一个简单的plt.plot
命令。
编辑:如果您确实需要矩阵矩阵,则需要将其他条目设为与B
def sigLinZ(val,omega):
B = 1./(omega*val*1j)
A = 1*np.ones(B.shape)
C = 0*np.ones(B.shape)
D = 1*np.ones(B.shape)
return np.array([[A,B],[C,D]])
其形状为(2,2,100)
,即最后一个索引设置一堆2x2矩阵的数组计数。 Sidenote ,就目前而言,B
除以零。