标签: sparse-matrix

将稀疏矩阵转储到文件中

我有一个scipy.sparse.csr矩阵,并希望将其转储到CSV文件.有没有办法保留矩阵的稀疏性并将其写入CSV?

python csv file-handling scipy sparse-matrix

7
推荐指数
1
解决办法
6677
查看次数

有效地积累稀疏的scipy矩阵的集合

我有一个O(N)NxN的集合scipy.sparse.csr_matrix,每个稀疏矩阵都有N个元素集的顺序.我想将所有这些矩阵一起添加到一个常规的NxN numpy数组中.(N大约为1000).矩阵内的非零元素的排列使得得到的和肯定不稀疏(事实上实际上没有留下零元素).

目前我正在做

reduce(lambda x,y: x+y,[m.toarray() for m in my_sparse_matrices])
Run Code Online (Sandbox Code Playgroud)

哪个有效但有点慢:当然,在那里进行的零点无意义处理绝对是可怕的.

有没有更好的办法 ?在文档中我没有什么明显的东西.

更新:根据user545424的建议,我尝试了对稀疏矩阵求和的替代方案,并将稀疏矩阵求和到密集矩阵上.下面的代码显示了在可比时间内运行的所有方法(在四核i7上的amd64 Debian/Squeeze上的Python 2.6.6)

import numpy as np
import numpy.random
import scipy
import scipy.sparse
import time

N=768
S=768
D=3

def mkrandomsparse():
    m=np.zeros((S,S),dtype=np.float32)
    r=np.random.random_integers(0,S-1,D*S)
    c=np.random.random_integers(0,S-1,D*S)
    for e in zip(r,c):
        m[e[0],e[1]]=1.0
    return scipy.sparse.csr_matrix(m)

M=[mkrandomsparse() for i in xrange(N)]

def plus_dense():
    return reduce(lambda x,y: x+y,[m.toarray() for m in M])

def plus_sparse():
    return reduce(lambda x,y: x+y,M).toarray()

def sum_dense():
    return sum([m.toarray() for m in M])

def sum_sparse():
    return …
Run Code Online (Sandbox Code Playgroud)

python optimization numpy scipy sparse-matrix

7
推荐指数
1
解决办法
1317
查看次数

Matlab不优化以下内容吗?

我有一个非常长的向量1xr v,一个非常长的向量w1xs,和一个矩阵Arxs,它是稀疏的(但尺寸非常大).

我期待Matlab优化以下内容,所以我不会遇到内存问题:

 A./(v'*w)
Run Code Online (Sandbox Code Playgroud)

但似乎Matlab实际上是在尝试生成完整的v'*w矩阵,因为我遇到了内存不足的问题.有办法克服这个问题吗?请注意,不需要计算所有v'*w值,因为很多值A都是0.

编辑:如果可能的话,一种方法就是这样做 A(find(A))./(v'*w)(find(A));

但是你不能先选择一个矩阵的子集(v'*w在这种情况下),而不先计算它并将它放在一个变量中.

matlab matrix sparse-matrix

7
推荐指数
1
解决办法
94
查看次数

如何在scipy中创建一个巨大的稀疏矩阵

我正在尝试创建一个非常庞大的稀疏矩阵,它具有一个形状(447957347, 5027974).并且,它包含3,289,288,566个元素.

但是,当我创建一个csr_matrix使用时scipy.sparse,它会返回如下内容:

<447957346x5027974 sparse matrix of type '<type 'numpy.uint32'>'
    with -1005678730 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)

创建矩阵的源代码是:

indptr = np.array(a, dtype=np.uint32)    # a is a python array('L') contain row index information
indices = np.array(b, dtype=np.uint32)   # b is  a python array('L') contain column index information
data = np.ones((len(indices),), dtype=np.uint32)
test = csr_matrix((data,indices,indptr), shape=(len(indptr)-1, 5027974), dtype=np.uint32)
Run Code Online (Sandbox Code Playgroud)

而且,我还发现当我将一个30亿长度的python数组转换为numpy数组时,它会引发一个错误:

ValueError:setting an array element with a sequence
Run Code Online (Sandbox Code Playgroud)

但是,当我创建三个10亿个长度的python数组,并将它们转换为numpy数组时,然后追加它们.它工作正常.

我糊涂了.

python arrays numpy scipy sparse-matrix

7
推荐指数
1
解决办法
1096
查看次数

将一列零添加到csr_matrix

我有一个MxN稀疏csr_matrix,我想在矩阵的右边添加一些只有零的列.原则上,阵列indptr,indicesdata保持相同的,所以我只是想改变矩阵的尺寸.但是,这似乎没有实现.

>>> A = csr_matrix(np.identity(5), dtype = int)
>>> A.toarray()
array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])
>>> A.shape
(5, 5)
>>> A.shape = ((5,7))
NotImplementedError: Reshaping not implemented for csr_matrix.
Run Code Online (Sandbox Code Playgroud)

水平堆叠零矩阵似乎也不起作用.

>>> B = csr_matrix(np.zeros([5,2]), dtype = int)
>>> B.toarray()
array([[0, 0],
       [0, 0],
       [0, 0],
       [0, 0],
       [0, 0]])
>>> np.hstack((A,B))
array([ …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy sparse-matrix

7
推荐指数
2
解决办法
3507
查看次数

将列值转换为自己的二进制编码列(虚拟变量)

我有许多CSV文件,其中包含性别,年龄,诊断等列.

目前,它们的编码如下:

ID, gender, age, diagnosis
1,  male,   42,  asthma
1,  male,   42,  anxiety
2,  male,   19,  asthma
3,  female, 23,  diabetes
4,  female, 61,  diabetes
4,  female, 61,  copd
Run Code Online (Sandbox Code Playgroud)

目标是将此数据转换为此目标格式:

旁注:如果可能的话,还可以将原始列名称添加到新列名称中,例如"age_42"或"gender_female".

ID, male, female, 42, 19, 23, 61, asthma, anxiety, diabetes, copd
1,  1,    0,      1,  0,  0,  0,  1,      1,       0,        0
2,  1,    0,      0,  1,  0,  0,  1,      0,       0,        0
3,  0,    1,      0,  0,  1,  0,  0,      0,       1,        0
4,  0, …
Run Code Online (Sandbox Code Playgroud)

r sparse-matrix reshape2

7
推荐指数
3
解决办法
3056
查看次数

如何使TF-IDF矩阵密集?

我正在使用TfidfVectorizer将原始文档的集合转换为TF-IDF特征的矩阵,然后我计划将其输入到k-means算法(我将实现).在该算法中,我将不得不计算质心(文章类别)和数据点(文章)之间的距离.我将使用欧几里德距离,所以我需要这两个实体具有相同的尺寸,在我的情况下max_features.这是我有的:

tfidf = TfidfVectorizer(max_features=10, strip_accents='unicode', analyzer='word', stop_words=stop_words.extra_stopwords, lowercase=True, use_idf=True)
X = tfidf.fit_transform(data['Content']) # the matrix articles x max_features(=words)
for i, row in enumerate(X):
    print X[i]
Run Code Online (Sandbox Code Playgroud)

然而,X似乎是一个稀疏(?)矩阵,因为输出是:

  (0, 9)    0.723131915847
  (0, 8)    0.090245047798
  (0, 6)    0.117465276892
  (0, 4)    0.379981697363
  (0, 3)    0.235921470645
  (0, 2)    0.0968780456528
  (0, 1)    0.495689001273

  (0, 9)    0.624910843051
  (0, 8)    0.545911131362
  (0, 7)    0.160545991411
  (0, 5)    0.49900042174
  (0, 4)    0.191549050212

  ...
Run Code Online (Sandbox Code Playgroud)

我想(0, col)状态列索引的矩阵,这实际上就像一个阵列,每一个细胞都指向一个列表,其中.

如何将此矩阵转换为密集矩阵(以便每行具有相同的列数)?


>print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis sparse-matrix tf-idf scikit-learn

7
推荐指数
1
解决办法
9880
查看次数

插入符号中的哪些模型可以使用X的稀疏矩阵?

我希望能够用一个稀疏矩阵作为xcaret::train,它看起来像很多人预期的数据帧.我已经能够使用稀疏矩阵与XGboostcaret,但nnetELM似乎都需要一个数据帧.我注意到在代码中,插入符号尝试转换x为数据框nnetELM模型.

是否有支持稀疏矩阵的模型列表?

r sparse-matrix r-caret

7
推荐指数
1
解决办法
1064
查看次数

将 CountVectorizer 应用于 Python 中行中单词列表的列

我为文本分析做了一个预处理部分,在删除停用词和词干后,如下所示:

test[col] = test[col].apply(
    lambda x: [ps.stem(item) for item in re.findall(r"[\w']+", x) if ps.stem(item) not in stop_words])

train[col] = train[col].apply(
    lambda x: [ps.stem(item) for item in re.findall(r"[\w']+", x) if ps.stem(item) not in stop_words])
Run Code Online (Sandbox Code Playgroud)

我有一个列有“清理词”列表的列。这是一列中的 3 行:

['size']
['pcs', 'new', 'x', 'kraft', 'bubble', 'mailers', 'lined', 'bubble', 'wrap', 'protection', 'self', 'sealing', 'peelandseal', 'adhesive', 'keeps', 'contents', 'secure', 'tamper', 'proof', 'durable', 'lightweight', 'kraft', 'material', 'helps', 'save', 'postage', 'approved', 'ups', 'fedex', 'usps']
['brand', 'new', 'coach', 'bag', 'bought', 'rm', 'coach', 'outlet']
Run Code Online (Sandbox Code Playgroud)

我现在想将 CountVectorizer 应用于此列

from …
Run Code Online (Sandbox Code Playgroud)

python cpu-word bag sparse-matrix countvectorizer

7
推荐指数
2
解决办法
7573
查看次数

有没有办法使用 python 进一步改进稀疏求解时间?

我一直在尝试 Python 3 中可用的不同稀疏求解器,并比较它们之间的性能以及与 Octave 和 Matlab 的性能。我选择了直接和迭代方法,我将在下面更详细地解释这一点。

为了生成具有带状结构的适当稀疏矩阵,使用具有 N=250、N=500 和 N=1000 的方格网格的有限元来解决泊松问题。这导致矩阵 A=N^2xN^2 和向量 b=N^2x1 的维度,即最大的 NxN 是一百万。如果有人对复制我的结果感兴趣,我已经在以下链接中上传了矩阵 A 和向量 b(它将在 30 天后过期)在此处使用获取系统。矩阵存储在三元组 I,J,V 中,即前两列分别是行和列的索引,第三列是与这些索引对应的值。观察到 V 中有一些接近零的值是故意留下的。尽管如此,在 Matlab 和 Python 中的“间谍”矩阵命令之后仍保留带状结构。

为了进行比较,我使用了以下求解器:

Matlab 和 Octave,直接求解器:规范x=A\b.

Matlab 和 Octave,pcg 求解器:预处理共轭梯度,pcg 求解器pcg(A,b,1e-5,size(b,1))(不使用预处理器)。

Scipy (Python),直接求解器:linalg.spsolve(A, b)其中 A 先前已格式化为csr_matrixformat。

Scipy (Python),pcg 求解器: sp.linalg.cg(A, b, x0=None, tol=1e-05)

Scipy (Python)、UMFPACK 求解器:spsolve(A, b)使用from scikits.umfpack import spsolve. 这个求解器显然在 Linux 下可用(仅?),因为它使用了 libsuitesparse [Timothy Davis, …

python performance matlab scientific-computing sparse-matrix

7
推荐指数
1
解决办法
591
查看次数