У меня есть матрица (32X48).
Как преобразовать матрицу в одномерный массив?
У меня есть матрица (32X48).
Как преобразовать матрицу в одномерный массив?
Если мы говорим о data.frame, то вы должны спросить себя, являются ли переменные того же типа? Если это случай, вы можете использовать rapply или unlist, так как data.frames являются списками, глубоко в их душах...
data(mtcars)
unlist(mtcars)
rapply(mtcars, c) # completely stupid and pointless, and slower
Либо прочитать его с помощью "scan", либо просто сделать 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
попробуйте 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-й массив.
От ?matrix
: "Матрица - частный случай двумерного" массива ". Вы можете просто изменить размеры матрицы/массива.
Elts_int <- as.matrix(tmp_int) # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
Возможно, так поздно, так или иначе, это мой способ преобразования матрицы в вектор:
library(gdata)
vector_data<- unmatrix(yourdata,byrow=T))
надеюсь, что это поможет
Вы можете использовать решение Joshua, но я думаю, вам нужно 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 - 1d-вектор.
Простой и быстрый, так как 1d-массив является по существу вектором
vector <- array[1:length(array)]
Если у вас вместо этого есть data.frame(df), который имел несколько столбцов, и вы хотите, чтобы вы векторизовали, вы можете сделать
as.matrix(df, ncol = 1)
вы можете использовать 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
. Третий экземпляр array
от x
, а четвертый использует функцию concatenate c()
. Я также пробовал unmatrix
из gdata
, но он слишком медленно упоминается здесь.
Вот некоторые из полученных нами численных результатов:
> 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
Сглаживание матрицы является общей операцией в Machine Learning, где матрица может представлять параметры для изучения, но использует алгоритм оптимизации из общей библиотеки, которая ожидает вектор параметров. Поэтому принято преобразовывать матрицу (или матрицы) в такой вектор. Это случай со стандартной R-функцией optim()
.