私は現在、各行で列挙している各列の情報に基づいて計算を実行するスパース行列を使用しています。各行は他の列とは完全に独立しています。しかし、大規模な行列の場合、このコードは非常に遅く(約2時間かかる)、行列を高密度に変換することはできません(8GB RAMに制限されています)。Scipyスパース行列の最適化
import scipy.sparse
import numpy as np
def process_row(a, b):
"""
a - contains the row indices for a sparse matrix
b - contains the column indices for a sparse matrix
Returns a new vector of length(a)
"""
return
def assess(mat):
"""
"""
mat_csr = mat.tocsr()
nrows, ncols = mat_csr.shape
a = np.arange(ncols, dtype=np.int32)
b = np.empty(ncols, dtype=np.int32)
result = []
for i, row in enumerate(mat_csr):
# Process one row at a time
b.fill(i)
result.append(process_row(b, a))
return result
if __name__ == '__main__':
row = np.array([8,2,7,4])
col = np.array([1,3,2,1])
data = np.array([1,1,1,1])
mat = scipy.sparse.coo_matrix((data, (row, col)))
print assess(mat)
私は、これをはるかに高速に実行できるように設計する方法があるかどうかを検討しています。本質的には、process_row
関数は(a、bから)インデックスのペア(行、col)を取り、別のスパース行列を使用して数式を実行し、結果を返します。この関数を変更するオプションはありませんが、実際には異なる行/列のペアを処理でき、同じ行のすべてを処理することに限定されません。