基于R?中某些值和索引矩阵的更有效的数据矩阵获取方法。

Luwei

假设我有一个像这样的值向量:

M=3;val<-rnorm(M)

和相应的索引矩阵,例如:

N=20;J=10;ind<-matrix(sample(1:M,N*J,replace=T),nrow=J)

我可以轻松地将值及其索引分配给数据矩阵,如下所示:

x<-matrix(val[ind],J,N)

现在,我有一个值矩阵,如:

val<-matrix(rnorm(M*J),nrow=J)

并且需要逐行分配值和索引(即val中的一行与ind中的一行)以获取数据矩阵。

我可以使用for循环来做到这一点:

x<-ind;
for(j in 1:J){x[j,]<-val[j,ind[j,]]}

但是我想知道是否有更有效的方法来做到这一点,尤其是避免使用for循环?

我需要重新采样并重复分配过程数十万次。因此,我担心for循环会占用大量时间。

K

另三种方法,一种使用sapply,一种矩阵子集和一种向量子集矩阵和向量子集看起来sapply比for循环要快,但子集要慢。

目前

matrix(val[1:J + (ind-1)*J],J,N)

看起来是最快的方法。

M <- 3; N <- 20; J <- 10
ind <- matrix(sample(1:M,N*J,replace=T),nrow=J)
val <- matrix(rnorm(M*J),nrow=J)

x<-ind;
for(j in 1:J){x[j,]<-val[j,ind[j,]]}

identical(x, t(sapply(1:J, function(j) val[j,ind[j,]])))
#[1] TRUE

identical(x, matrix(val[matrix(c(rep(1:J, N), ind), ncol=2)],J,N))
#[1] TRUE
#Other ways for rep(1:J, N)
identical(x, matrix(val[matrix(c(row(ind), ind), ncol=2)],J,N))
#[1] TRUE
identical(x, matrix(val[matrix(c(slice.index(ind, 1), ind), ncol=2)],J,N))
#[1] TRUE

#Vector subsetting as suggested by Aaron
identical(x, matrix(val[row(ind) + (ind-1)*J],J,N))
#[1] TRUE
#Other ways
identical(x, matrix(val[1:J + (ind-1)*J],J,N))
#[1] TRUE
identical(x, matrix(val[sweep((ind-1)*J, 1, 1:J, "+")],J,N))
#[1] TRUE

速度比较:

library(microbenchmark)

f1 <- function() {
  x<-ind;
  for(j in 1:J){x[j,]<-val[j,ind[j,]]}
}
f2 <- function() {t(sapply(1:J, function(j) val[j,ind[j,]]))}
f3 <- function() {matrix(val[matrix(c(row(ind), ind), ncol=2)],J,N)}
f4 <- function() {matrix(val[row(ind) + (ind-1)*J],J,N)} #Comment from Aaron
f5 <- function() {matrix(val[1:J + (ind-1)*J],J,N)}

microbenchmark(f1(), f2(), f3(), f4(), f5(), setup=gc)
#Unit: microseconds
# expr    min      lq     mean  median      uq     max neval
# f1() 16.540 18.3595 20.11216 19.8820 20.7915  36.201   100
# f2() 43.514 46.3650 49.77573 48.0320 49.5120 113.631   100
# f3()  8.325  9.3265 10.38931  9.9425 10.4825  46.561   100
# f4()  6.934  7.8270  9.00286  8.4405  9.1355  25.840   100
# f5()  5.839  6.8730  7.71322  7.3520  8.3145  16.349   100

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一种获取矩阵中的正切索引或值的有效方法

从R中的索引集中获取矩阵元素的有效方法是什么?

替换矩阵(R)中的值的有效方法

将索引分配给矩阵中的True值的有效numpy方法

在R中生成特殊矩阵的更有效函数

这种矩阵乘法更通用或更有效的方法?

以更有效的方式产生矩阵

如何使排列矩阵更有效?

R中矩阵的有效子集和列求和

在R中过滤数据的更有效方法

在R中创建市场篮子矩阵的有效方法

使用Matrix的值作为行索引在R中另一个矩阵中查找值的最有效方法

linq从基于另一个表的表中获取数据的更有效方法?

知道矩阵对称且为正半定数的更有效的矩阵求逆方法

基于2d numpy数组中的索引列表访问行的更有效方法?

如何有效地从矩阵的每个重复行中获取最小值和最大值

有什么更有效的方法来计算矩阵中除其自身列以外的每一行的最大值?

如何以更有效的方式创建/索引该矩阵?

无效的顶点和索引数据解析,寻找更有效的方法

numpy中的每列矩阵索引有效

根据起始索引和相应长度的列表删除矩阵列的最有效方法

获取索引值的有效方法

有没有更有效的方法来计算距离矩阵?

获取Pyspark数据框最大值的更有效方法

根据另一个矩阵中的值移动一个矩阵中的值的有效方法

从用户获取数字并填充矩阵的有效方法

如何更有效地存储距离矩阵?

使矩阵切片的循环更有效

以列-行对为键,以矩阵中的对应值为值创建对称矩阵字典的有效方法