Python对返回数组的函数进行向量化

计算科学 Python 麻木的 特殊功能
2021-12-05 00:17:00

我有以下已矢量化的函数,因此对于输入数组 t 中的每个元素,输出一个数组:

@np.vectorize
def Ham(t):
    d=np.array([[np.cos(t),np.sqrt(t)],[0,1]],dtype=np.complex128)
    return d

我收到一个错误:TypeError: only length-1 arrays can be converted to Python scalars我相信当与 numpy 和 python 发生冲突时会发生此错误,但我看不出那会在哪里。另外,如果没有给出 dtype,错误是ValueError: setting an array element with a sequence.我猜你不能在 python 的数组中分配数组,但我还能怎么做呢?

1个回答

问题是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)

笔记:

  1. 只是一个便利功能,它实际上并没有使代码运行得更快np.vectorize
  2. 这个问题可能更适合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)