ベクター配列内のベクター配列にインデックスを付ける方法

ケン・ブノワ

ループを伴う問題の解決策はあり、機能しますが、より効率的な実装を伴う何かが欠けていると感じています。問題:数値ベクトルシーケンスがあり、最初のベクトルの別のベクトルの開始位置を特定したい。

それはこのように動作します:

# helper function for matchSequence
# wraps a vector by removing the first n elements and padding end with NAs
wrapVector <- function(x, n) {
    stopifnot(n <= length(x))
    if (n == length(x)) 
        return(rep(NA, n))
    else
        return(c(x[(n+1):length(x)], rep(NA, n)))
}

wrapVector(LETTERS[1:5], 1)
## [1] "B" "C" "D" "E" NA
wrapVector(LETTERS[1:5], 2)
## [1] "C" "D" "E" NA  NA

# returns the starting index positions of the sequence found in a vector
matchSequence <- function(seq, vec) {
    matches <- seq[1] == vec
    if (length(seq) == 1) return(which(matches))
    for (i in 2:length(seq)) {
        matches <- cbind(matches, seq[i] == wrapVector(vec, i - 1))
    }
    which(rowSums(matches) == i)
}

myVector <- c(3, NA, 1, 2, 4, 1, 1, 2)
matchSequence(1:2, myVector)
## [1] 3 7
matchSequence(c(4, 1, 1), myVector)
## [1] 5
matchSequence(1:3, myVector)
## integer(0)

実装するためのより良い方法はありmatchSequence()ますか?

追加

ここでの「より良い」とは、私が考えもしなかったよりエレガントな方法を使用することを意味しますが、さらに良いとは、より速くなることを意味します。ソリューションを次のように比較してみてください。

set.seed(100)
myVector2 <- sample(c(NA, 1:4), size = 1000, replace = TRUE)
matchSequence(c(4, 1, 1), myVector2)
## [1]  12  48  91 120 252 491 499 590 697 771 865

microbenchmark::microbenchmark(matchSequence(c(4, 1, 1), myVector2))
## Unit: microseconds
##                                 expr     min       lq     mean   median       uq     max naval
## matchSequence(c(4, 1, 1), myVector2) 154.346 160.7335 174.4533 166.2635 176.5845 300.453   100
alexis_laz

そして再帰的なアイデア(16年2月5日に編集してNAsをパターンで処理する)

find_pat = function(pat, x) 
{
    ff = function(.pat, .x, acc = if(length(.pat)) seq_along(.x) else integer(0L)) {
        if(!length(.pat)) return(acc)

        if(is.na(.pat[[1L]])) 
            Recall(.pat[-1L], .x, acc[which(is.na(.x[acc]))] + 1L)
        else 
            Recall(.pat[-1L], .x, acc[which(.pat[[1L]] == .x[acc])] + 1L)
    }

    return(ff(pat, x) - length(pat))
}  

find_pat(1:2, myVector)
#[1] 3 7
find_pat(c(4, 1, 1), myVector)
#[1] 5
find_pat(1:3, myVector)
#integer(0)
find_pat(c(NA, 1), myVector)
#[1] 2
find_pat(c(3, NA), myVector)
#[1] 1

そしてベンチマークで:

all.equal(matchSequence(s, my_vec2), find_pat(s, my_vec2))
#[1] TRUE
microbenchmark::microbenchmark(matchSequence(s, my_vec2), 
                               flm(s, my_vec2), 
                               find_pat(s, my_vec2), 
                               unit = "relative")
#Unit: relative
#                      expr      min       lq   median       uq      max neval
# matchSequence(s, my_vec2) 2.970888 3.096573 3.068802 3.023167 12.41387   100
#           flm(s, my_vec2) 1.140777 1.173043 1.258394 1.280753 12.79848   100
#      find_pat(s, my_vec2) 1.000000 1.000000 1.000000 1.000000  1.00000   100

より大きなデータの使用:

set.seed(911); VEC = sample(c(NA, 1:3), 1e6, TRUE); PAT = c(3, 2, 2, 1, 3, 2, 2, 1, 1, 3)
all.equal(matchSequence(PAT, VEC), find_pat(PAT, VEC))
#[1] TRUE
microbenchmark::microbenchmark(matchSequence(PAT, VEC), 
                               flm(PAT, VEC), 
                               find_pat(PAT, VEC), 
                               unit = "relative", times = 20)
#Unit: relative
#                    expr       min       lq    median        uq       max neval
# matchSequence(PAT, VEC) 23.106862 20.54601 19.831344 18.677528 12.563634    20
#           flm(PAT, VEC)  2.810611  2.51955  2.963352  2.877195  1.728512    20
#      find_pat(PAT, VEC)  1.000000  1.00000  1.000000  1.000000  1.000000    20

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

配列インデックスデータをデータベースの別の行に保存する方法は?

分類Dev

配列内の各インデックスについてデータベースから選択する方法

分類Dev

配列内の文字列にインデックスを付ける方法は?

分類Dev

Rの配列によるベクトルのインデックス付け

分類Dev

PHPの配列にインデックスを付ける方法

分類Dev

Laravelデータベースクエリをインデックス付きのphp配列に入れるにはどうすればよいですか?

分類Dev

Railsのデータベースから返されるレコードの配列のインデックスを見つける方法は?

分類Dev

データベースにインデックスを付ける方法は?

分類Dev

EloquentORMでデータベースをクエリするときの配列インデックスの問題

分類Dev

Rの関数内のデータフレーム列にインデックスを付ける方法

分類Dev

jsonデータをデータベースに挿入するときに配列内の配列にアクセスする方法は?

分類Dev

高度なインデックス作成:(32,125)配列を2つの(32、)配列でインデックス付けすることにより、(32,125)配列を(13,13,32,125)配列に割り当てるベクトル化された方法

分類Dev

foreachではなくlaravelforループ内で配列を適切にインデックス付けする方法

分類Dev

関数パラメーターを使用して、関数内の2Dnumpy配列にインデックスを付ける

分類Dev

配列にインデックスを付ける短い方法

分類Dev

C#配列にインデックスを付ける方法

分類Dev

ブールベクトルを使用したnumpy配列のインデックス付け

分類Dev

別の配列を使用して配列にインデックスを付ける-gcc6.3ランタイムエラー

分類Dev

JSで配列内のベクターを削除する方法

分類Dev

VUEjsで配列内のデータのインデックスを取得する

分類Dev

numpy配列に配列でインデックスを付ける方法

分類Dev

配列内の配列のインデックスを見つける方法

分類Dev

postgresデータベースのJSON配列を含む列内でクエリを実行する方法

分類Dev

複数のデータベース行の配列内の配列にアクセスする

分類Dev

numpy配列に別の配列のインデックスを付ける

分類Dev

Unityインスペクターで配列内の要素ラベル(要素0-要素...)を削除する方法

分類Dev

元の配列でソートされたデータのインデックスを見つける方法は?

分類Dev

numpy配列に別の配列でインデックスを付ける

分類Dev

codeigniterを使用してMYSQLデータベースの配列インデックスを使用してファイルをアップロードする方法

Related 関連記事

  1. 1

    配列インデックスデータをデータベースの別の行に保存する方法は?

  2. 2

    配列内の各インデックスについてデータベースから選択する方法

  3. 3

    配列内の文字列にインデックスを付ける方法は?

  4. 4

    Rの配列によるベクトルのインデックス付け

  5. 5

    PHPの配列にインデックスを付ける方法

  6. 6

    Laravelデータベースクエリをインデックス付きのphp配列に入れるにはどうすればよいですか?

  7. 7

    Railsのデータベースから返されるレコードの配列のインデックスを見つける方法は?

  8. 8

    データベースにインデックスを付ける方法は?

  9. 9

    EloquentORMでデータベースをクエリするときの配列インデックスの問題

  10. 10

    Rの関数内のデータフレーム列にインデックスを付ける方法

  11. 11

    jsonデータをデータベースに挿入するときに配列内の配列にアクセスする方法は?

  12. 12

    高度なインデックス作成:(32,125)配列を2つの(32、)配列でインデックス付けすることにより、(32,125)配列を(13,13,32,125)配列に割り当てるベクトル化された方法

  13. 13

    foreachではなくlaravelforループ内で配列を適切にインデックス付けする方法

  14. 14

    関数パラメーターを使用して、関数内の2Dnumpy配列にインデックスを付ける

  15. 15

    配列にインデックスを付ける短い方法

  16. 16

    C#配列にインデックスを付ける方法

  17. 17

    ブールベクトルを使用したnumpy配列のインデックス付け

  18. 18

    別の配列を使用して配列にインデックスを付ける-gcc6.3ランタイムエラー

  19. 19

    JSで配列内のベクターを削除する方法

  20. 20

    VUEjsで配列内のデータのインデックスを取得する

  21. 21

    numpy配列に配列でインデックスを付ける方法

  22. 22

    配列内の配列のインデックスを見つける方法

  23. 23

    postgresデータベースのJSON配列を含む列内でクエリを実行する方法

  24. 24

    複数のデータベース行の配列内の配列にアクセスする

  25. 25

    numpy配列に別の配列のインデックスを付ける

  26. 26

    Unityインスペクターで配列内の要素ラベル(要素0-要素...)を削除する方法

  27. 27

    元の配列でソートされたデータのインデックスを見つける方法は?

  28. 28

    numpy配列に別の配列でインデックスを付ける

  29. 29

    codeigniterを使用してMYSQLデータベースの配列インデックスを使用してファイルをアップロードする方法

ホットタグ

アーカイブ