2

我有以下问题。我想评估以下功能

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)

但这不起作用。蟒蛇说:

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 函数,这个过程工作得很好,但对于我的函数,它根本不起作用。

4

2 回答 2

3

您正在尝试将数组插入到omega要传递给方法的定义中的矩阵元素中。您需要迭代omega将每个元素sigLinZ分别传递给,或者您需要重新编写sigLinZ以处理数组并返回矩阵列表或 3D 数组之类的东西。

于 2013-09-03T13:50:12.057 回答
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 矩阵的数组计数。就目前而言,旁注B除以零。

于 2013-09-03T13:50:29.120 回答