Numpy:引发ValueError("形状太大而不能成为矩阵。")

时间:2018-01-16 16:28:54

标签: python numpy matrix

我使用的是12x12的numpy矩阵,而且我的形状太大而不能成为矩阵。"我最好的猜测是numpy" kron"功能正在制造麻烦。

这是我的代码:

    a = np.matrix("0 1 0; 0 0 1; 0 0 0 ")
    a_dag = np.matrix("0 0 0; 1 0 0 ; 0 1 0")
    Sp = np.matrix("0 1; 0 0")
    Sm = np.matrix("0 0; 1 0")
    ...
119 H_I1 = (np.exp(1j*(phi-omega*t))*kron(np.eye(3),Sp,np.eye(2))
120         +np.exp(-1j*(phi-omega*t))*kron(np.eye(3),Sm,np.eye(2)))
121 H_I2 = kron(a,Sp,np.eye(2)) + kron(a_dag,Sm,np.eye(2))

这是错误:

Traceback (most recent call last):
  File "/home/fyodr/qc_final.py", line 121, in <module>
    H_I2 = kron(a,Sp,np.eye(2)) + kron(a_dag,Sm,np.eye(2))
  File "/home/fyodr/qc_final.py", line 70, in kron
    return np.kron(m[0],kron(m[1:]))
  File "/usr/lib/python2.7/dist-packages/numpy/lib/shape_base.py", line 754, in kron
    result = wrapper(result)
  File "/usr/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 303, in __array_finalize__
    raise ValueError("shape too large to be a matrix.")
ValueError: shape too large to be a matrix.

谢谢!

编辑:我将kron定义为

def kron(*m):
    if len(m) == 1:
        return m
    else :
        return np.kron(m[0],kron(m[1:]))

如果np.kron正在计算一个普通的kronecker产品,那么这应该不是问题。

1 个答案:

答案 0 :(得分:0)

正如我评论的那样,你的kron有3个参数是未知的。但如果它产生一个3d数组作为某个阶段,它可能会产生你的错误。

In [264]: np.kron(a.A, np.ones((3,3,3))).shape
Out[264]: (3, 9, 9)

带有3d的2d数组返回3d数组。但如果anp.matrix,它会尝试将其转换为matrix,从而导致错误。 np.matrix总是2d。

In [265]: np.kron(a, np.ones((3,3,3))).shape
---------------------------------------------------------------------------
....
ValueError: shape too large to be a matrix.

有经验的numpy用户除非我们确实需要其功能,否则不会使用np.matrix

使用您添加的kron,递归步骤执行:

In [270]: m = (a, Sp, np.eye(2))
In [271]: kron(m[1:])
Out[271]: 
((matrix([[0, 1],
          [0, 0]]), array([[ 1.,  0.],
         [ 0.,  1.]])),)
In [272]: np.array(_)
Out[272]: 
array([[[[ 0.,  1.],
         [ 0.,  0.]],

        [[ 1.,  0.],
         [ 0.,  1.]]]])
In [273]: _.shape
Out[273]: (1, 2, 2, 2)

对于2个项目,您的kron返回一个嵌套的数组元组。 np.kronnp.asanyarray(b)应用于第二个参数,从而生成一个4d数组。

kron应用于完整*m,但将矩阵转换为数组:

In [275]: kron(a.A, Sp.A, np.eye(2))
Out[275]: 
array([[[[ 0.,  0.,  0.,  1.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  1.],
         [ 0.,  0.,  0.,  0.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  0.]],

        [[ 0.,  0.,  1.,  0.,  0.,  0.],
         [ 0.,  0.,  0.,  1.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  1.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  1.],
         [ 0.,  0.,  0.,  0.,  0.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  0.]]]])
In [276]: _.shape
Out[276]: (1, 2, 6, 6)

您是否自己测试了kron功能?它应该在用于更复杂的任务之前进行调试。