我有一个以下列格式读取数据的程序:
Row Column Value
1 1 4
1 3 5
2 1 6
...
Run Code Online (Sandbox Code Playgroud)
其中前两列引用矩阵的索引,值列包含存储在矩阵中该(坐标,列)坐标的值.
如果我实际构造一个二维数组来表示矩阵,那么它将非常大,因为我的输入数据非常稀疏.相反,我想构建一个稀疏矩阵表示,它允许我查找对应于(行,列)对的值,如果它不存在则返回0.
似乎boost有办法做到这一点,但我找不到足够的文档来真正理解如何使用它.
我已经深入阅读了这些内容,但我仍然不确定如何处理:
http://www.guwi17.de/ublas/doc/html/ex__fill1_8cpp-source.html http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm
我是一个c ++新手,所以不确定如何使用boost从我的输入数据创建一个稀疏矩阵(假设我已经读过它).我也没有运气如何使用boost稀疏矩阵实际返回与(行,列)对相关的值.任何人都可以向我指出一些基本的例子,或解释我如何做到这一点?
感谢您提供任何帮助.
我正在使用MATLAB.我有非常大的 稀疏矩阵,我想执行logical或bsxfun在这个矩阵中的每一列.有一个for循环,其中有一个logical填充稀疏矩阵的操作.在这里,我包含一个带有一些虚假小数据的示例函数,以查看我正在尝试做什么;
function maskMat()
graph_temp = round(rand(10,10));
tic;
com_mat = round(rand(10,10));
com = round(rand(10,1));
for ii=1:length(graph_temp)
com_mat(:,ii) = logical(com ~= com(ii));
%bsxfun works too but is slightly slower
%com_mat(:,ii) = bsxfun(@ne,com,com(ii));
end
toc;
com_mat = graph_temp .* com_mat;
graph_temp并且com_mat大约有1M行和列,并且代码对for循环来说非常慢.关于SO还有另一个相关的问题,但我还没有理解它背后的理论,看看我是否也可以将这些解决方案应用于这个问题.
我想要编写一个mexc ++函数或尝试获得某种嵌套,arrayfun以便每个logical/ bsxfun操作被调用为更大函数的子例程,以避免for循环瓶颈.
运行这段代码
d0 = np.ones(N)
dp1 = np.ones(N - 1)
dm1 = np.ones(N - 1)
diag = [[d0],[dp1],[dm1]]
offsets = [0,1,-1]
A = dia_matrix( (diag,offsets), shape=(N,N), dtype=float)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.py", line 109, in __init__
self.data = np.atleast_2d(np.array(arg1[0], dtype=dtype, copy=copy))
Run Code Online (Sandbox Code Playgroud)
ValueError:使用序列设置数组元素。
我不明白我在做什么错!有人可以给我一个正确的榜样来做我想做的事情吗?
我想以一种imagesc类型的样式绘制稀疏矩阵(每个像素一种颜色,而不是符号a la scatter)。矩阵由分布在10000x10000平方上的斑点组成。我预计大约有100个Blob,每个Blob为50x100像素。这个矩阵是如此之大,以至于放大或缩小或在其中四处移动以检查数据都变得很麻烦。而且我仍然想保持分辨率。有没有办法绘制一个稀疏矩阵,该矩阵仅绘制斑点并以色图的“零色”作为背景,而不会占用内存空间?
假设我们有一个矩阵M,看起来像这样:
[1, 2, 1, 0;
0, 1, .4, 0;
0, 0, 0, 0;
0, 7, 0, 0]
Run Code Online (Sandbox Code Playgroud)
当我将其绘制为稀疏矩阵时
figure;
imagesc(sparse(M));
Run Code Online (Sandbox Code Playgroud)
它的大小与省略稀疏命令的大小相同。这就是我要规避的。
假设我有一个矩阵,如:
4 0 3 5
0 2 6 0
7 0 1 0
Run Code Online (Sandbox Code Playgroud)
我希望它二进制化为:
0 0 0 0
0 1 0 0
0 0 1 0
Run Code Online (Sandbox Code Playgroud)
即将阈值设置为2,将大于阈值的任何元素设置为0,将小于或等于阈值的任何元素(除0)设置为1.
我们可以在python的csr_matrix或任何其他稀疏矩阵上执行此操作吗?
我知道scikit-learn提供Binarizer将低于或等于阈值的值替换为0,高于1.
我有相当大的稀疏矩阵(dgCMatrix或dgTMatrix,但这在这里不是很重要)。我想将某些元素设置为零。
例如,我有一个3e4 * 3e4矩阵,该矩阵是上三角形,并且非常密集:〜23%的元素不是零。(实际上,我有更大的矩阵〜1e5 * 1e5,但是它们更稀疏了)因此,以三重态的dgTMatrix形式需要大约3.1gb的RAM。现在,我想将小于某个阈值(例如1)的所有元素设置为零。
非常幼稚的做法(这还讨论这里)将以下内容:
threshold <- 1
m[m < threshold] <- 0
Run Code Online (Sandbox Code Playgroud)
但是,该解决方案远非完美-130秒的运行时间(在具有足够内存的机器上,因此没有交换),更重要的是需要25-30gb的额外RAM。
我发现的第二个解决方案(并且大部分是满意的)更加有效-从头开始构建新矩阵:
threshold <- 1
ind <- which(m@x > threshold)
m <- sparseMatrix(i = m@i[ind], j = m@j[ind], x = m@x[ind],
dims = m@Dim, dimnames = m@Dimnames,
index1 = FALSE,
giveCsparse = FALSE,
check = FALSE)
Run Code Online (Sandbox Code Playgroud)
它需要仅〜6秒和需要5GB〜额外 RAM。
问题是-我们可以做得更好吗?尤其有趣的是,是否可以用更少的RAM使用率来做到这一点?如果能够就地执行此操作,那将是完美的。
我有一个Python Pandas DataFrame,如下所示:
1
0 a, b
1 c
2 d
3 e
Run Code Online (Sandbox Code Playgroud)
a, b 是代表用户功能列表的字符串
如何将其转换为用户功能的二进制矩阵,如下所示:
a b c d e
0 1 1 0 0 0
1 0 0 1 0 0
2 0 0 0 1 0
3 0 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
我看到了一个类似的问题,即用熊猫从一列创建布尔矩阵,但是该列不包含列表项。
我已经尝试过这些方法,有没有办法将两者合并:
pd.get_dummies()
pd.get_dummies(df[1])
a, b c d e
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
df[1].apply(lambda x: pd.Series(x.split())) …
我有一个(密集)矩阵nxnxm和一个稀疏矢量(scipy.sparse)1 x m.如果我们查看我的密集nxnxm矩阵,它可以被解释为在每个位置amx 1向量上的nxn矩阵.现在我想用nxn矩阵中的每个mx 1密集向量计算稀疏向量的点积,产生具有所有这些点积的焦虑矩阵.
一种方法是构建一个for循环来循环遍历nxn矩阵,然后使用scipy.sparse的.dot()函数来计算矩阵中每个向量的点积.但是,我正在寻找一种完全以矢量化方式执行此计算的方法,以提高效率.这可能吗?如果没有,Python中循环我的nxn矩阵的最快方法是什么?
我在使用scipy.sparse.csr_matrix时遇到问题:
例如:
a = csr_matrix([[1,2,3],[4,5,6]])
b = csr_matrix([[7,8,9],[10,11,12]])
Run Code Online (Sandbox Code Playgroud)
如何将它们合并到
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
Run Code Online (Sandbox Code Playgroud)
我知道一种方法是首先将它们转换为numpy数组:
csr_matrix(numpy.vstack((a.toarray(),b.toarray())))
Run Code Online (Sandbox Code Playgroud)
但是当矩阵庞大且稀疏时它将无法工作,因为内存会耗尽.
那么有没有办法在csr_matrix中将它们合并在一起?
任何答案都表示赞赏!
搜索网站后,我找不到解决此问题的方法.它很简单,我想更新一个已经存在的co稀疏矩阵.所以我要说我已经启动了一个库矩阵:
from scipy.sparse import coo_matrix
import numpy as np
row = np.array([0, 3, 1, 0])
col = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
a=coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
Run Code Online (Sandbox Code Playgroud)
很好,但如果我只想要一个空的稀疏数组并仅使用形状启动它,然后多次更新值.我成功的唯一方法是在我的旧库中添加一个新的铜阵
a=coo_matrix((4, 4), dtype=np.int8)
a=a+coo_matrix((data, (row, col)), shape=(4, 4))
a.toarray()
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
Run Code Online (Sandbox Code Playgroud)
我想多次更新这个稀疏数组.但是这需要很长时间,因为我正在为每次更新调用coo函数.必须有一个更好的方法,但我觉得文档有点轻(至少我读过)或我只是没有看到它.
非常感谢