【问题标题】:Create a sparse matrix from a generator从生成器创建稀疏矩阵
【发布时间】:2014-12-02 23:11:29
【问题描述】:

我想创建一个大的稀疏矩阵,由于内存问题,它的源数据无法完全加载。您可能认为我们在磁盘上有一个 非常 大的文件,我们无法读取它。

我考虑了一下,但找不到从生成器创建稀疏矩阵的方法。

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.

有什么想法吗?

编辑:我找到了this,还没有尝试过,但看起来很有帮助。

【问题讨论】:

  • 你想用这个数据和矩阵做什么?
  • 稀疏矩阵本身不能是生成器。 coo_matrix 的关键数据结构是 3 个 numpy 数组。如果源数据在内存中放不下,稀疏矩阵也放不下。
  • pytables 可能会起作用 - stackoverflow.com/questions/11129429
  • 谢谢。嗯。如果源数据不能放入内存,稀疏矩阵也不能,这不是有点奇怪。我并不是说稀疏矩阵包含生成器。我想逐行有效地创建一个稀疏矩阵。通过这样做,我可能有稀疏的数据,如果我表示为密集,则无法适应。你怎么看?

标签: python scipy sparse-matrix


【解决方案1】:

这是一个使用生成器填充稀疏矩阵的示例。我使用生成器填充结构化数组,并根据其字段创建稀疏矩阵。

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 的字段和稀疏矩阵的行、列、数据数组。

也可以从 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 是此类作业最便宜的格式。

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多