【问题标题】:Numpy: raise ValueError("shape too large to be a matrix.")Numpy: raise ValueError("shape too large to be a matrix.")
【发布时间】:2018-01-16 16:28:54
【问题描述】:

我正在使用一个 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 积,那么这应该不是问题。

【问题讨论】:

  • 这是什么kron?你给它 3 个参数,而 np.kron 需要 2 个。给出一个最小的工作(至少对于错误)示例。如果可行,请跳过H_I1 行。并分别评估 H_I2 的 2 个部分,以便我们知道 - 而您 - 知道导致问题的原因。
  • 我猜kron 确实创建了一个更高维的数组,实际上是 4d。您需要在其他代码中使用之前对其进行调试。

标签: python numpy matrix


【解决方案1】:

正如我评论的那样,您的 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 函数吗?它应该在用于更复杂的任务之前进行调试。

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多