Nic*_*mer 6 python scipy sparse-matrix
我有一个 SciPy 稀疏矩阵A(比如说 CSR 格式)和一个v匹配长度的向量。
行缩放的最佳方式是什么,即
A执行?vdiag(v) * A
最简单的方法是让 scipy 处理这些细节,只需执行以下操作:
scipy.sparse.spdiags(v, 0, len(v), len(v)) * A
Run Code Online (Sandbox Code Playgroud)
编辑如果(且仅当)您的矩阵以 CSC 格式存储,您可以按如下方式进行操作:
A_csc.data = A_csc.data * v[A_csc.indices]
Run Code Online (Sandbox Code Playgroud)
我已经做了一些计时,它很大程度上取决于矩阵的稀疏性及其大小,请随意使用以下代码:
from __future__ import division
import numpy as np
import scipy.sparse as sps
import timeit
A_csr = None
A_csc = None
v = None
def time_row_scaling(n, dens) :
global A_csr, A_csc, v
v = np.random.rand(n)
A_csr = sps.rand(n, n, density=dens, format='csr')
A_csc = A_csr.tocsc()
def row_scale(A_csc, v) :
A_csc.data = A_csc.data * v[A_csc.indices]
row_scaled_1 = sps.spdiags(v, 0, n , n) * A_csr
row_scaled_2 = sps.spdiags(v, 0, n , n) * A_csc
row_scale(A_csc, v)
if n < 1000 :
np.testing.assert_almost_equal(row_scaled_1.toarray(),
row_scaled_2.toarray())
np.testing.assert_almost_equal(row_scaled_1.toarray(),
A_csc.toarray())
A_csc = A_csr.tocsc()
t1 = timeit.timeit('sps.spdiags(v, 0, len(v) , len(v)) * A_csr',
'from __main__ import sps, v, A_csr',
number=1)
t2 = timeit.timeit('sps.spdiags(v, 0, len(v), len(v)) * A_csc',
'from __main__ import sps, v, A_csc',
number=1)
t3 = timeit.timeit('A_csc.data = A_csc.data * v[A_csc.indices]',
'from __main__ import A_csc, v',
number=1)
print t1, t2, t3
>>> time_row_scaling(1000, 0.01)
0.00100659830939 0.00102425072673 0.000231944553347
>>> time_row_scaling(1000, 0.1)
0.0017328105481 0.00311339379218 0.00239826562947
>>> time_row_scaling(10000, 0.01)
0.0162369397769 0.0359325217874 0.0216837368279
>>> time_row_scaling(10000, 0.1)
0.167978350747 0.492032396702 0.209231639536
Run Code Online (Sandbox Code Playgroud)
总结似乎是,如果是CSR,或者真的很大,就用简单的第一种方法。如果它是一个很小的、非常稀疏的矩阵,那么就地方法会更快,尽管那时所有的时间都很小。
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |