问题是np.cos(t)并np.sqrt(t)生成长度为 的数组t,而第二行 ( [0,1]) 保持相同的大小。要np.vectorize与您的函数一起使用,您必须定义输出类型,并且除了最简单的情况外,实际上并不意味着作为装饰器。但是,通过这种方式,您可以生成具有正确类型的函数:np.vectorize
def Ham(t):
d=np.array([[np.cos(t),np.sqrt(t)],[0,1]],dtype=np.complex128)
return d
HamVec = np.vectorize(Ham, otypes=[np.ndarray])
现在您可以HamVec用作函数:
>>> x=np.array([1,2,3])
>>> HamVec(x)
array([ array([[ 0.54030231+0.j, 1.00000000+0.j],
[ 0.00000000+0.j, 1.00000000+0.j]]),
array([[-0.41614684+0.j, 1.41421356+0.j],
[ 0.00000000+0.j, 1.00000000+0.j]]),
array([[-0.98999250+0.j, 1.73205081+0.j],
[ 0.00000000+0.j, 1.00000000+0.j]])], dtype=object)
笔记:
- 这只是一个便利功能,它实际上并没有使代码运行得更快。
np.vectorize
- 这个问题可能更适合StackOverflow。
编辑:作为后续问题的答案:矩阵的结果值是类型numpy.complex128:
>>> y = HamVec(x)
>>> type(y[0][0][0])
<type 'numpy.complex128'>
例如,您可以这样做:
>>> y*np.complex('3+2j')
array([ array([[ 1.62090692+1.08060461j, 3.00000000+2.j ],
[ 0.00000000+0.j , 3.00000000+2.j ]]),
array([[-1.24844051-0.83229367j, 4.24264069+2.82842712j],
[ 0.00000000+0.j , 3.00000000+2.j ]]),
array([[-2.96997749-1.97998499j, 5.19615242+3.46410162j],
[ 0.00000000+0.j , 3.00000000+2.j ]])], dtype=object)