एक मैट्रिक्स को 1 आयामी सरणी में बदलें


110

मेरे पास एक मैट्रिक्स (32X48) है।

मैं मैट्रिक्स को एकल आयामी सरणी में कैसे बदल सकता हूं?

जवाबों:


214

या तो इसे 'स्कैन' के साथ पढ़ें, या मैट्रिक्स पर 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-डी सरणी नहीं, बल्कि 1-डी वेक्टर।
ग्रेग

30

यदि हम डेटा.फ्रेम के बारे में बात कर रहे हैं, तो आपको खुद से पूछना चाहिए कि एक ही प्रकार के चर हैं? यदि ऐसा है, तो आप rapply का उपयोग कर सकते हैं, या अनलिस्ट कर सकते हैं, क्योंकि डेटा.फ्रेम सूची में हैं, उनकी आत्माओं में गहरा ...

 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
तालिका पढ़ें डेटा लौटाता है। मैट्रिक्स नहीं। क्या यह अभी भी 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

मैट्रिक्स को समतल करना मशीन लर्निंग में एक सामान्य ऑपरेशन है, जहां एक मैट्रिक्स सीखने के लिए मापदंडों का प्रतिनिधित्व कर सकता है, लेकिन एक सामान्य लाइब्रेरी से ऑप्टिमाइज़ेशन एल्गोरिथ्म का उपयोग करता है जो मापदंडों के एक वेक्टर की अपेक्षा करता है। इसलिए मैट्रिक्स (या मैट्रिक्स) को ऐसे वेक्टर में बदलना आम है। यह मानक आर फ़ंक्शन के साथ मामला है 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

1 डी सरणी के बाद से सरल और तेज अनिवार्य रूप से एक वेक्टर है

vector <- array[1:length(array)]

1

यदि आपके पास एक data.frame (df) था जिसमें कई कॉलम थे और आप वेक्टर करना चाहते हैं तो आप कर सकते हैं

as.matrix (df, ncol = 1)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.