【问题标题】:Python example for scipy dia_matrixscipy dia_matrix 的 Python 示例
【发布时间】:2014-06-15 06:28:08
【问题描述】:

运行此代码

d0  = np.ones(N)
dp1 = np.ones(N - 1)
dm1 = np.ones(N - 1)

diag = [[d0],[dp1],[dm1]]
offsets = [0,1,-1]

A = dia_matrix( (diag,offsets), shape=(N,N), dtype=float)

我收到以下错误:

File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.py", line 109, in __init__
self.data = np.atleast_2d(np.array(arg1[0], dtype=dtype, copy=copy))

ValueError: 使用序列设置数组元素。

我不明白我做错了什么!有人可以为我提供一个正确的例子来做我想做的事吗?

【问题讨论】:

    标签: python python-2.7 scipy sparse-matrix


    【解决方案1】:

    dia_matrix 的第一个参数具有(data, offsets) 的形式时,data 应为二维数组,data 的每一行都包含矩阵的对角线。由于data 是一个矩形矩阵,所以data 中的一些元素会被忽略。下对角线“左对齐”,超对角线“右对齐”。 (具体来说,data 和稀疏矩阵A 之间的映射是data[i,j] == A[j - offsets[i], j]。)例如,考虑以下将用于创建 5x5 矩阵:

    In [28]: data
    Out[28]: 
    array([[ 1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10],
           [11, 12, 13, 14, 15]])
    
    In [29]: offsets
    Out[29]: [0, 1, -1]
    

    data 包含三个对角线。由于offset[0] 为0,data 的第0 行包含主对角线。该行中的所有 5 个元素都用于矩阵中。 offset[1] 为 1,因此 data[1] 中的数据成为第一个超对角线。只会使用值[7, 8, 9, 10];第一个值6 被忽略。同样,data 的第三行给出了第一个对角线,并且只使用了值[11, 12, 13, 14]

    In [30]: a = dia_matrix((data, offsets), shape=(5, 5))
    
    In [31]: a.A
    Out[31]: 
    array([[ 1,  7,  0,  0,  0],
           [11,  2,  8,  0,  0],
           [ 0, 12,  3,  9,  0],
           [ 0,  0, 13,  4, 10],
           [ 0,  0,  0, 14,  5]])
    

    你的例子可以改写如下:

    In [32]: N = 5
    
    In [33]: data = np.ones((3, 5))
    
    In [34]: A = dia_matrix((data, offsets), shape=(N, N), dtype=float)
    
    In [35]: A.A
    Out[35]: 
    array([[ 1.,  1.,  0.,  0.,  0.],
           [ 1.,  1.,  1.,  0.,  0.],
           [ 0.,  1.,  1.,  1.,  0.],
           [ 0.,  0.,  1.,  1.,  1.],
           [ 0.,  0.,  0.,  1.,  1.]])
    

    dia_matrix 文档字符串还有另一个例子。

    或者,您可以使用scipy.sparse.diags 创建矩阵。如果您已经有生成“正确”大小的对角线的代码,这将很有用。使用diags,您不必创建矩形data 矩阵。例如,

    In [104]: from scipy.sparse import diags
    
    In [105]: d0 = ones(n)
    
    In [106]: dp1 = np.ones(N - 1)
    
    In [107]: dm1 = np.ones(N - 1)
    
    In [108]: d = [d0, dp1, dm1]
    
    In [109]: B = diags(d, offsets, dtype=float)
    
    In [110]: B.A
    Out[110]: 
    array([[ 1.,  1.,  0.,  0.,  0.],
           [ 1.,  1.,  1.,  0.,  0.],
           [ 0.,  1.,  1.,  1.,  0.],
           [ 0.,  0.,  1.,  1.,  1.],
           [ 0.,  0.,  0.,  1.,  1.]])
    

    【讨论】:

    • 非常有用的描述!谢谢~
    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多