我可以使用i,j和x的向量定义稀疏矩阵:
i <- c(1,3:8)
j <- c(2,9,6:10)
x <- 7 * (1:7)
(A <- sparseMatrix(i, j, x = x))
Run Code Online (Sandbox Code Playgroud)
我想提取i,j以及x从该稀疏矩阵的元素,所以我可以重新创建另一个包中的矩阵.这是容易i和x:
i <- A@i + 1
x <- A@x
Run Code Online (Sandbox Code Playgroud)
(注意,i和x的顺序已经改变,但它们的相对关联是相同的:i = 4仍然在x = 21的同一位置)
但是,稀疏矩阵的最后一个元素是p:"指针的数字(整数值)向量,每列(或行)一个,到列(或行)中元素的初始(从零开始)索引. "
如何转换A@i并A@p转换为j用于定义矩阵的原始元素?
说我有一个方形的NxN crs矩阵辣.我想通过保持M个索引(由N个布尔数组给出,其中M为真)将该矩阵限制为子空间.这应该给我一个MxM稀疏矩阵.
因此,显然,一种方法是将系数提取为数据数组和两个坐标数组,并使用排序重新编号坐标.这很痛苦,有点难看.
是不是有功能,或者是图书馆调用呢?
我有一个点云 C,其中每个点都有一个关联的值。假设这些点在二维空间中,所以每个点都可以用三元组 (x, y, v) 表示。
我想找到局部最大值点的子集。也就是说,对于某个半径 R,我想找到 C 中点 S 的子集,使得对于 S 中的任何点 Pi(具有值 vi),在距离 Pi 的 R 距离内,C 中没有点 Pj 的值 vj 为大于 vi。
我知道如何在 O(N^2) 时间内做到这一点,但这似乎很浪费。有没有一种有效的方法来做到这一点?
旁注:
numpy sparse-array kdtree sparse-matrix computational-geometry
我在 JavaScript 中有一个数组,如下所示:
var pattern = [ ["C5", 3], , , , , , , , ["C5", 3], , , ]
Run Code Online (Sandbox Code Playgroud)
我想将它存储在这样的 json 文件中:
{
"pattern": [
["C5", 3], , , , , , , , ["C5", 3], , ,
]
}
Run Code Online (Sandbox Code Playgroud)
JSONLint 告诉我这个:
Parse error on line 6:
... ], , ,
---------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
Run Code Online (Sandbox Code Playgroud)
所以我明白我不能让逗号之间的空格为空。什么类似于空,但被 JSON 标准接受?
这个模式文件是我正在制作的 Javascript Music Tracker 的一部分,它类似于脉冲跟踪器,我希望 json 文件尽可能干净。
我有一个密列矩阵y的大小(m,1)和稀疏矩阵x大小(m,n)。
我想使用y和 的每一列进行元素乘法x。
生成的稀疏矩阵的大小仍然为(m,n)。
Sparse matrixx加载到内存时大约为 10GB。
可以spfun帮助我以高效记忆的方式实现我的目标吗?
我很难理解它背后的逻辑。
谢谢你。
有没有一种很好的方法来测量或检查scipy.sparse矩阵的密度?
例如:
import scipy.sparse
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])
mat = scipy.sparse.coo_matrix((data,(row,col)), shape=(4,4))
print mat.todense()
[[4 0 9 0]
[0 7 0 0]
[0 0 0 0]
[0 0 0 5]]
Run Code Online (Sandbox Code Playgroud)
也许返回的东西可以让我获得总体密度的一般统计信息,例如每行的平均占用率(即第一行占2/4值,第二行占1/4,第三行占0/4,第四行占1/4因此平均占用率/密度将为1/4),stddev,方差等。也许可以采用一种更好的密度度量标准,而该密度度量标准不依赖于矩阵的大小(假设其足够大)。
我有一个包含数百万条记录的数据集,其中包含 100,000 个用户,他们购买了 20,000 件商品的子集,格式如下:
<user1, item1>
<user1, item12>
...
<user100,000, item>
Run Code Online (Sandbox Code Playgroud)
我需要跟踪一个大小(物品 x 用户)=(20,000 x 100,000)的矩阵,如果用户购买了物品,则为 1,否则为 0。目前我使用的是传统的 numpy 数组,但在后面的步骤中处理它需要很长时间。任何人都可以推荐一种使用 SciPy 稀疏矩阵之一的有效方法,它仍然允许基于索引搜索矩阵?
以下代码在R控制台(R 3.3.0)中正常工作:
m = system.file("external/pores_1.mtx", package = "Matrix")
x = Matrix::readMM(m)
Run Code Online (Sandbox Code Playgroud)
我可以把它放在一个脚本中,它可以在R控制台中正常运行:
source("test.R")
Run Code Online (Sandbox Code Playgroud)
然而,当我执行它Rscript --vanilla test.R或者Rscript test.R,我得到一个错误:
Error in validObject(.Object) :
invalid class “dgTMatrix” object: Not a valid 'Mnumeric' class object
Calls: <Anonymous> -> new -> initialize -> initialize -> validObject
Execution halted
Run Code Online (Sandbox Code Playgroud)
我不知道这是否与该特定功能有关.我猜这与Rscript的工作原理有关,但我以前用过各种其他库和函数,从未见过这样的东西.知道发生了什么事吗?
Ubuntu16.04_64bit + Python3.5.2 + numpy1.13.3 + scipy1.0.0当我处理a scipy.sparse.csc.csc_matrix和a之间的矩阵乘法时,我遇到了这个问题 numpy.ndarray.我会在这里给出一个例子:
import numpy as np
import scipy.sparse
a = np.random.random(1000,1000)
b = np.random.random(1000,2000)
da = scipy.sparse.csc.csc_matrix(a)
db = scipy.sparse.csc.csc_matrix(b)
ab = a.dot(b)
dadb = da.dot(db)
dab = da.dot(b)
Run Code Online (Sandbox Code Playgroud)
然后差异看起来像这样:
In [31]: np.sum(dadb.toarray() != ab)
Out[31]: 1869078
In [33]: np.sum(dab != dadb.toarray())
Out[33]: 0
In [34]: np.sum(dab != ab)
Out[34]: 1869078
Run Code Online (Sandbox Code Playgroud)
为什么?它们之间的区别是什么?怎么办呢?
这个问题关系到这个和这个。此处的区别在于,我没有传递Rcpp类型(例如NumericVector或)NumericMatrix,而是传递arma::sp_mat。
有什么方法可以将A传递sp_mat给C ++,修改其值,并使更改显示在R中的原始对象中吗?
可以使用来完成NumericMatrix,例如:
cppFunction("void frob(NumericMatrix& x)
{
for(NumericMatrix::iterator it = x.begin(); it != x.end(); ++it)
{
if(*it != 0) *it = *it + 5;
}
}")
M <- Matrix(0, 5, 1, sparse=TRUE)
M[1] <- 1.2345
m <- as.matrix(M)
frob(m)
m
#[,1]
#[1,] 6.2345
#[2,] 0.0000
#[3,] 0.0000
#[4,] 0.0000
#[5,] 0.0000
Run Code Online (Sandbox Code Playgroud)
相同的技术适用于arma::mat密集矩阵。但是对于稀疏矩阵,它不起作用:
cppFunction("void frob2(arma::sp_mat& x)
{
for(arma::sp_mat::iterator it = x.begin(); it != x.end(); …Run Code Online (Sandbox Code Playgroud) sparse-matrix ×10
numpy ×4
scipy ×4
python ×3
r ×3
armadillo ×1
arrays ×1
javascript ×1
json ×1
kdtree ×1
matlab ×1
matrix ×1
python-2.7 ×1
rcpp ×1
rscript ×1
sparse-array ×1