Вот как это сделать, используя scipy.sparse.diags
.diags
похож на spdiags
, но немного удобнее.
>>> import numpy as np
>>> from scipy import sparse, linalg
>>>
>>> a = sparse.csr_matrix(np.random.randint(-50, 10, (1, 10)).clip(0, None))
>>> b = sparse.csr_matrix(np.random.randint(-50, 10, (1, 10)).clip(0, None))
В этом примере есть векторы строк, для векторов столбцов можно привести к csc
, а затем продолжить таким же образом.
>>> # dense method for reference
>>> d_toepl = linalg.toeplitz(a.A, b.A)
>>>
>>> idx = b.indices[0] == 0 # make sure first element of b is ignored
>>> vals, offs = np.r_[a.data, b.data[idx:]], np.r_[-a.indices, b.indices[idx:]]
>>> N = max(a.shape[1], b.shape[1])
>>> dtype = (a[0, ...] + b[0, ...]).dtype
>>>
>>> s_toepl = sparse.diags(vals, offs, (N, N), dtype=dtype)
>>>
>>> np.all(d_toepl == s_toepl)
True
fliplr
можно сделать с помощью индексации.Небольшое замечание: не все классы разреженных матриц в настоящее время поддерживают индексирование, возможно, вам придется приводить.
>>> np.all(np.fliplr(d_toepl) == s_toepl.tocsr()[:, ::-1])
True