簡體   English   中英

從生成器創建稀疏矩陣

[英]Create a sparse matrix from a generator

我想創建一個大的稀疏矩陣,由於內存問題,其源數據無法完全加載。 你可能會認為我們在磁盤上一個非常大的文件,我們無法讀取它。

我考慮了一下,但是我找不到從生成器創建稀疏矩陣的方法。

from scipy.sparse import coo_matrix
matrix1 = coo_matrix(xrange(10)) # it works. Create a sparse matrix with 9 elements.
data = ((0, 1, random.randint(0,5)) for i in xrange(10)) # generator example
matrix2 = coo_matrix(data) # does not work.

任何想法?

編輯 :我發現了這個 ,還沒有嘗試過,但是看起來很有幫助。

這是一個使用生成器填充稀疏矩陣的示例。 我使用生成器填充結構化數組,並根據其字段創建稀疏矩陣。

import numpy as np
from scipy import sparse
N, M = 3,4
def foo(N,M):
    # just a simple dense matrix of random data
    cnt = 0
    for i in xrange(N):
        for j in xrange(M):
            yield cnt, (i, j, np.random.random())
            cnt += 1

dt = dt=np.dtype([('i',int), ('j',int), ('data',float)])
X = np.empty((N*M,), dtype=dt)
for cnt, tup in foo(N,M):
    X[cnt] = tup

print X.shape
print X['i']
print X['j']
print X['data']
S = sparse.coo_matrix((X['data'], (X['i'], X['j'])), shape=(N,M))
print S.shape
print S.A

產生類似:

(12,)
[0 0 0 0 1 1 1 1 2 2 2 2]
[0 1 2 3 0 1 2 3 0 1 2 3]
[ 0.99268494  0.89277993  0.32847213  0.56583702  0.63482291  0.52278063
  0.62564791  0.15356269  0.1554067   0.16644956  0.41444479  0.75105334]
(3, 4)
[[ 0.99268494  0.89277993  0.32847213  0.56583702]
 [ 0.63482291  0.52278063  0.62564791  0.15356269]
 [ 0.1554067   0.16644956  0.41444479  0.75105334]]

所有非零數據點將以2種形式存在於內存中X的字段和稀疏矩陣的row,col,data數組。

也可以從csv文件的列中加載類似X的結構化數組。

您可以使用幾種稀疏矩陣格式來設置數據元素,例如

S = sparse.lil_matrix((N,M))
for cnt, tup in foo(N,M):
    i,j,value = tup
    S[i,j] = value
print S.A

sparse告訴我,對於這種類型的分配, lil是最便宜的格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM