AMcoder - javascript, python, java, html, php, sql

R. Բացարձակ պտտվող շեղում (օֆսեթ 1-ով) մատրիցայի վրա

Ես ունեմ մեծ մատրիցա/տվյալների շրջանակ (2500x20) և պետք է, ըստ սյունակի, գլորվող շեղում մաքսիմումով, քան նախորդ բոլոր բջիջների նվազագույնը, բացառելով հոսանքը:

Ես իմ ֆունկցիան կիրառում եմ սյունակով: Իմ ֆունկցիան տեղափոխում է ամբողջ սյունակը (որպես վեկտոր) 1:length-ով՝ արտադրելով ցուցակների ցանկ: Ինձ սա պետք է որպես մատրիցա max(x)-min(x) ֆունկցիան կիրառելու համար: Սա աշխատում է փոքր մատրիցայի համար և չափազանց երկար է աշխատում ինձ անհրաժեշտ չափի համար:

(փոքր) աղբյուրը (տրամադրված).

      [,1] [,2] [,3] [,4] [,5]
 [1,]   55    9   99    0   NA
 [2,]   54    7   98    1   NA
 [3,]   56   12   97    2   NA
 [4,]   53    8   96    3    1
 [5,]   57   22   95    4    0
 [6,]   52   51   94    5   -1
 [7,]   58    6   93    6   NA
 [8,]   51    6   93    7    0
 [9,]   59   51   92    8    2
[10,]   50   78   91    9   NA
[11,]   60   12   90   10   NA
[12,]   49    5   89   11   -2

Ակնկալվող արդյունքը.

      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    0    0
 [2,]    0    0    0    0    0
 [3,]    1    2    1    1    0
 [4,]    2    5    2    2    0
 [5,]    3    5    3    3    0
 [6,]    4   15    4    4    1
 [7,]    5   44    5    5    2
 [8,]    6   45    6    6    2
 [9,]    7   45    6    7    2
[10,]    8   45    7    8    3
[11,]    9   72    8    9    3
[12,]   10   72    9   10    3

Առաջին արդյունքի տողը միշտ կլինի 0, քանի որ այն չունի նախորդ տողեր, որոնցից կարող է հաշվարկվել:
Երկրորդ արդյունքի տողը միշտ կլինի զրո, քանի որ նախորդ մեկ տողը առավելագույն և նվազագույն արժեքն է:
Վերջին աղբյուրը - շարքը երբեք չի ազդի արդյունքի վրա:

Ինչ ունեմ մինչ այժմ.

library(data.table)

mytest <- matrix(c(
55, 9,99, 0,NA,
54, 7,98, 1,NA,
56,12,97, 2,NA,
53, 8,96, 3, 1,
57,22,95, 4, 0,
52,51,94, 5,-1,
58, 6,93, 6,NA,
51, 6,93, 7, 0,
59,51,92, 8, 2,
50,78,91, 9,NA,
60,12,90,10,NA,
49, 5,89,11,-2
), ncol=5, byrow = TRUE)

rolling_deviation <- function (a_column){
    tmp1 = shift(a_column, 1:(length(a_column)-1), NA, "lag")
    tmp2 = matrix(unlist(tmp1), ncol = length(a_column), byrow = TRUE)
    apply(tmp2,2,function(x){
        x = x[!is.na(x)]
        ifelse(length(x)==0, 0, max(x) - min(x))
    })
}

apply(mytest,2,rolling_deviation)  

Ինձ սա պետք է ավելի արագ հաշվարկելու համար, քանի որ դիտարկումները շատանում են, ավելի շատ տողեր կլինեն:

r
18.05.2017

  • Ձեզ կարող է անհրաժեշտ լինել նշել օգտագործվող փաթեթները 18.05.2017
  • Կներեք, կոդը (data.table) ավելացվեց. ես անտեսեցի shift-ը: 18.05.2017

Պատասխանները:


1

Ինչ կասեք սրա մասին:

> system.time(outcome<- apply(mytest,2,rolling_deviation)) 
   user  system elapsed 
  0.014   0.002   0.038 

> system.time(outcome1<- setDT(data.frame(mytest))[, lapply(.SD, rolling_deviation)])
   user  system elapsed 
  0.002   0.000   0.002 

Արդյունքները նույնն են.

> outcome
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    0    0
 [2,]    0    0    0    0    0
 [3,]    1    2    1    1    0
 [4,]    2    5    2    2    0
 [5,]    3    5    3    3    0
 [6,]    4   15    4    4    1
 [7,]    5   44    5    5    2
 [8,]    6   45    6    6    2
 [9,]    7   45    6    7    2
[10,]    8   45    7    8    3
[11,]    9   72    8    9    3
[12,]   10   72    9   10    3

> outcome1
    X1 X2 X3 X4 X5
 1:  0  0  0  0  0
 2:  0  0  0  0  0
 3:  1  2  1  1  0
 4:  2  5  2  2  0
 5:  3  5  3  3  0
 6:  4 15  4  4  1
 7:  5 44  5  5  2
 8:  6 45  6  6  2
 9:  7 45  6  7  2
10:  8 45  7  8  3
11:  9 72  8  9  3
12: 10 72  9 10  3
18.05.2017
  • Ցավոք, դա չի ազդում 2500x20 տվյալների վրա 23.05.2017

  • 2

    Ես լուծեցի իմ խնդիրը՝ ստեղծելով ներդիր հանգույց։ Ինձ սովորեցրել են, որ օղակների դիմելը գրեթե միշտ վատ կլինի կատարման համար, բայց ես ավելի լավ միջոց չեմ կարող գտնել: Ինձ պետք է օգնական ֆունկցիա իմ min/max գործողությունների համար, քանի որ ԱԺ արգումենտները հավանական են, և իմ նպատակի համար սխալ չեն:

    rolling_range <- function(in_mat){
        ignore_na = function(op, a,b){
            if(is.na(a)){
                return(b)
            }else if(is.na(b)){
                return(a)
            }else{
                return(op(a,b))
            }
        }
        out_mat.min = matrix(NA, nrow = nrow(in_mat), ncol = ncol(in_mat))
        out_mat.max = matrix(NA, nrow = nrow(in_mat), ncol = ncol(in_mat))
        out_mat.result = matrix(0, nrow = nrow(in_mat), ncol = ncol(in_mat))
        for(m in 1:ncol(in_mat)){
            for(n in 2:nrow(in_mat)){
                out_mat.min[n,m] = ignore_na(`min`, out_mat.min[(n-1),m], in_mat[(n-1),m])
                out_mat.max[n,m] = ignore_na(`max`, out_mat.max[(n-1),m], in_mat[(n-1),m])
                out_mat.result[n,m] = ifelse(is.na(out_mat.min[n,m]) || is.na(out_mat.max[n,m]), 0, out_mat.max[n,m] - out_mat.min[n,m] )
            }
        }
        return(out_mat.result)
    }
    
    rolling_range(mytest)
    
    23.05.2017
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..