我有一个矩阵(32X48)。
如何将矩阵转换为单维数组?
来自 ?matrix: “矩阵是二维‘数组’的特殊情况。”您可以简单地更改矩阵/数组的尺寸。
?matrix
Elts_int <- as.matrix(tmp_int) # read.table returns a data.frame as Brandon noted dim(Elts_int) <- (maxrow_int*maxcol_int,1)
你可以使用约书亚的解决方案,但我认为你需要 Elts_int <- as.matrix(tmp_int)
Elts_int <- as.matrix(tmp_int)
或者循环:
z <- 1 ## Initialize counter <- 1 ## Initialize for(y in 1:48) { ## Assuming 48 columns otherwise, swap 48 and 32 for (x in 1:32) { z[counter] <- tmp_int[x,y] counter <- 1 + counter } }
Z 是一维矢量。
要么用“扫描”方式读入,要么在矩阵上执行 as.Vector ()。如果需要按行或列转换矩阵,可能需要首先转换矩阵。
> m=matrix(1:12,3,4) > m [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > as.vector(m) [1] 1 2 3 4 5 6 7 8 9 10 11 12 > as.vector(t(m)) [1] 1 4 7 10 2 5 8 11 3 6 9 12
如果我们讨论的是 data.frame 那么你应该问自己这些变量是同一类型的吗?如果是这样的话,你可以使用 rapplication,或者 unlist,因为 data.frame 是列表,在它们的灵魂深处..。
data(mtcars) unlist(mtcars) rapply(mtcars, c) # completely stupid and pointless, and slower
试试 c()
c()
x = matrix(1:9, ncol = 3) x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 c(x) [1] 1 2 3 4 5 6 7 8 9
array(A)或 array(t(A))将为您提供一个1-d 数组。
array(A)
array(t(A))
因为1d 数组本质上是一个向量,所以它简单而快速
result <- matrix[1:length(matrix)]
也许已经太晚了,不管怎样,这是我把 Matrix 转换成矢量的方法:
library(gdata) vector_data<- unmatrix(yourdata,byrow=T))
希望能有所帮助
如果您有一个包含多个列的 data.frame (df) ,并且希望向量化,那么可以这样做
矩阵(df,ncol= 1)
你可以使用 as.vector()。根据我的小基准,它看起来是最快的方法,如下:
as.vector()
library(microbenchmark) x=matrix(runif(1e4),100,100) # generate a 100x100 matrix microbenchmark(y<-as.vector(x),y<-x[1:length(x)],y<-array(x),y<-c(x),times=1e4)
第一个解决方案使用 as.vector(),第二个解决方案使用一个矩阵作为一个连续的数组存储在内存中,并且 length(m)给出了一个矩阵 m中的元素数。第三个实例化来自 x的 array,第四个使用连接函数 c()。我也尝试从 gdata的 unmatrix,但它太慢,以至于不能在这里提到。
length(m)
m
x
array
gdata
unmatrix
下面是我得到的一些数值结果:
> microbenchmark( y<-as.vector(x), y<-x[1:length(x)], y<-array(x), y<-c(x), times=1e4) Unit: microseconds expr min lq mean median uq max neval y <- as.vector(x) 8.251 13.1640 29.02656 14.4865 15.7900 69933.707 10000 y <- x[1:length(x)] 59.709 70.8865 97.45981 73.5775 77.0910 75042.933 10000 y <- array(x) 9.940 15.8895 26.24500 17.2330 18.4705 2106.090 10000 y <- c(x) 22.406 33.8815 47.74805 40.7300 45.5955 1622.115 10000
平坦化矩阵是机器学习中的一种常见操作,其中矩阵可以表示要学习的参数,但是要使用通用库中的优化算法,该算法需要参数向量。因此,将矩阵(或矩阵)转换成这样的向量是很常见的。这就是标准 R 函数 optim()的情况。
optim()
对于希望不仅生成数组,而且生成具有相应的 Row 和 Column 名称的数组的任何人,我推荐使用 这个中的 melt 函数。
library(reshape2) df.L <- melt( df, id.vars="New_name4_rownames", value.name="NAME_of_VALUE", variable.name="New_name4_colnames" ) print(df.L)
然后您可以根据需要组合行和列的名称,并使用 span/pivot _ wide 将列名称组合为矩阵的行 + 列名称和矢量为1的行。
df.L$Both <- paste0(df.L$New_name4_rownames, "_", df.L$New_name4_colnames) df.sel <- df.L[,3:4] #select only values and combined column names output1d <- pivot_wider(data = df.sel, names_from = Both, values_from = NAME_of_VALUE)