Преобразование матрицы в одномерный массив

111

Имею матрицу (32Х48).

Как преобразовать матрицу в одномерный массив?

Алос
источник

Ответы:

215

Либо прочитайте его с помощью '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
Космонавт
источник
33

пытаться 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
Грег
источник
Это вектор, а не одномерный массив.
Хэдли
хм. Это правда. Возможно, не одномерный массив, а одномерный вектор.
Грег,
30

Если мы говорим о data.frame, то вы должны спросить себя, являются ли переменные одного типа? Если это так, вы можете использовать rapply или unlist, поскольку data.frames - это списки, глубоко в их душах ...

 data(mtcars)
 unlist(mtcars)
 rapply(mtcars, c) # completely stupid and pointless, and slower
aL3xa
источник
14

array(A)или array(t(A))даст вам 1-мерный массив.

Тиан
источник
12

From ?matrix: «Матрица - это частный случай двумерного« массива »». Вы можете просто изменить размеры матрицы / массива.

Elts_int <- as.matrix(tmp_int)  # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
Джошуа Ульрих
источник
1
Таблица чтения возвращает data.frame, а не матрицу. Будет ли это работать без as.matrix ()?
Брэндон Бертельсен,
6

Может быть, уже так поздно, но вот мой способ конвертировать Matrix в вектор:

library(gdata)
vector_data<- unmatrix(yourdata,byrow=T))

надеюсь, что это поможет

хема
источник
4

вы можете использовать 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. Третий экземпляр создает экземпляр arrayfrom x, а четвертый использует функцию конкатенации 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

Сглаживание матрицы - обычная операция в машинном обучении, где матрица может представлять параметры для изучения, но при этом используется алгоритм оптимизации из общей библиотеки, которая ожидает вектор параметров. Поэтому обычно матрицу (или матрицы) преобразуют в такой вектор. Это дело со стандартной функцией R optim().

Дэвид Беллот
источник
1

Вы можете использовать решение Джошуа, но я думаю, вам нужно 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-вектор.

Брэндон Бертельсен
источник
1

Просто и быстро, поскольку 1d-массив по сути является вектором

vector <- array[1:length(array)]
Джефф
источник
1

Если вместо этого у вас был data.frame (df) с несколькими столбцами, и вы хотите векторизовать, вы можете сделать

as.matrix (df, ncol = 1)

Ли Санде
источник