Перетворіть матрицю в 1-мірний масив


110

У мене є матриця (32X48).

Як я можу перетворити матрицю в одномірний масив?

Відповіді:


214

Або прочитайте його за допомогою "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

32

спробуйте 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

Це вектор, а не 1-денний масив.
хадлі

хм. Це правда. Можливо, не 1-d масив, а 1-d вектор.
Грег

30

Якщо ми говоримо про data.frame, то ви повинні запитати себе, чи є змінні одного типу? Якщо це так, ви можете скористатися репліками або unlist, оскільки data.frames - це списки, глибоко в їх душі ...

 data(mtcars)
 unlist(mtcars)
 rapply(mtcars, c) # completely stupid and pointless, and slower


12

З ?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

Це може бути пізно, все одно ось мій шлях перетворення Матриці у вектор:

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. Третя інстанціює arrayз 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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.