<p>这就形成了一个稀疏矩阵(51,1),每一行都有一个值:</p>
<pre><code>In [5]: sparse.spdiags(data,[0,-1,-2],51,1)
Out[5]:
<51x1 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements (3 diagonals) in DIAgonal format>
In [6]: print(_)
(0, 0) -8037.5
(1, 0) 50.0
(2, 0) -12.5
</code></pre>
<p>请注意,<code>spdiags</code>定义:</p>
<blockquote>
<p>data : array_like
matrix diagonals stored row-wise</p>
</blockquote>
<p>Sparse<code>diagonal format</code>将其数据存储在一个矩阵中,其中一部分可以“屏幕外”。所以使用起来有点棘手。我通常使用<code>coo</code>样式的输入创建矩阵。在</p>
^{pr2}$
<p>你想要的是它的转置(也许)</p>
<pre><code>In [32]: Mt = M.T
In [33]: Mt.A
Out[33]:
array([[-8037.5, 50. , -12.5],
[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ]])
In [34]: Mt.data
Out[34]:
array([[-8037.5, 0. , 0. ],
[ 0. , 50. , 0. ],
[ 0. , 0. , -12.5]])
In [35]: Mt.offsets
Out[35]: array([0, 1, 2], dtype=int32)
</code></pre>
<p>因此我们可以用以下方法重新创建<code>Mt</code>:</p>
<pre><code>sparse.spdiags(Mt.data, Mt.offsets, 3,3)
</code></pre>
<hr/>
<p>如果我保存倍频程矩阵并加载它,我得到:</p>
<pre><code>In [40]: loadmat('diags')
Out[40]:
{'__globals__': [],
'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0, 2017-10-19 01:24:58 UTC',
'__version__': '1.0',
'x': <1x51 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Column format>}
In [42]: X=_['x']
In [43]: print(X)
(0, 0) -8037.5
(0, 1) 50.0
(0, 2) -12.5
</code></pre>
<p>如果我把它转换成<code>dia</code>格式,就会得到类似<code>Mt</code>的格式:</p>
<pre><code>In [48]: sparse.dia_matrix(X)
Out[48]:
<1x51 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements (3 diagonals) in DIAgonal format>
In [49]: print(_)
(0, 0) -8037.5
(0, 1) 50.0
(0, 2) -12.5
In [50]: _.data, _.offsets
Out[50]:
(array([[-8037.5, 0. , 0. ],
[ 0. , 50. , 0. ],
[ 0. , 0. , -12.5]]), array([0, 1, 2]))
</code></pre>
<p>{cd7>可能更直观一些:</p>
<pre><code>In [92]: sparse.diags(data, [0,1,2],(1,3))
Out[92]:
<1x3 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements (3 diagonals) in DIAgonal format>
In [93]: _.A
Out[93]: array([[-8037.5, 50. , -12.5]])
In [94]: print(__)
(0, 0) -8037.5
(0, 1) 50.0
(0, 2) -12.5
</code></pre>
<hr/>
<pre><code>In [56]: sp1 = sparse.spdiags(A_diag1, np.r_[0:2 + 1], 1, 51)
In [57]: sp2 = sparse.spdiags(A_diag2, np.r_[0:2 + 1], 49, 51)
In [58]: sp3 = sparse.spdiags(A_diag3, np.r_[48:50 + 1], 1, 51)
</code></pre>
<p>(<code>r_</code>表达式也可以是<code>np.arange(0,3)</code>和{<cd10>})</p>
<p>它们可以与<code>sparse.vstack</code>(它结合了<code>coo</code>格式属性)</p>
<pre><code> In [69]: B = sparse.vstack((sp1,sp2,sp3))
In [72]: B
Out[72]:
<51x51 sparse matrix of type '<class 'numpy.float64'>'
with 147 stored elements in COOrdinate format>
In [75]: B.tocsr()[45:, 46:].A
Out[75]:
array([[ 1250., 0., 0., 0., 0.],
[-18505., 1250., 0., 0., 0.],
[ 1250., -18505., 1250., 0., 0.],
[ 0., 1250., -18505., 0., 0.],
[ 0., 0., 1250., 0., 0.],
[ 0., 0., 0., 0., 0.]])
</code></pre>
<p>与快照匹配。(我还需要弄清楚你想创造什么)。在</p>
<p><code>sparse.spdiags(data, diags, m, n)</code>只是调用<code>sparse.dia_matrix((data, diags), shape=(m,n))</code>的另一种方式</p>
<p>回到<code>sparse.diags</code>,如果您想要3条对角线,每个对角线都填充一个来自<code>data</code>的值,我们可以使用:</p>
<pre><code>In [111]: B = sparse.diags(data,[0,1,2],(51,51))
In [112]: B
Out[112]:
<51x51 sparse matrix of type '<class 'numpy.float64'>'
with 150 stored elements (3 diagonals) in DIAgonal format>
In [114]: B.tocsr()[:5,:5].A
Out[114]:
array([[-8037.5, 50. , -12.5, 0. , 0. ],
[ 0. , -8037.5, 50. , -12.5, 0. ],
[ 0. , 0. , -8037.5, 50. , -12.5],
[ 0. , 0. , 0. , -8037.5, 50. ],
[ 0. , 0. , 0. , 0. , -8037.5]])
In [115]: B.tocsr()[45:, 46:].A
Out[115]:
array([[ 50. , -12.5, 0. , 0. , 0. ],
[-8037.5, 50. , -12.5, 0. , 0. ],
[ 0. , -8037.5, 50. , -12.5, 0. ],
[ 0. , 0. , -8037.5, 50. , -12.5],
[ 0. , 0. , 0. , -8037.5, 50. ],
[ 0. , 0. , 0. , 0. , -8037.5]])
</code></pre>
<p>所以<code>sp1</code>必须看起来像</p>
<pre><code>In [117]: B.tocsr()[0,:].todia().data
Out[117]:
array([[-8037.5, 0. , 0. ],
[ 0. , 50. , 0. ],
[ 0. , 0. , -12.5]])
</code></pre>