配列からn個の重複しないmサイズのサンプルを取得します

カブラルピント

配列が与えられた場合、それからnサイズの重複しないランダムサンプルを抽出するにはどうすればよいmですか?

たとえば、配列が与えられた場合:

const arr = [1, 2, 3, 4, 5, 6, 7, 8];

呼び出しsample(arr, 3, 2)例のリターンのためになり[[7, 8], [4, 5], [2, 3]]、呼び出しsample(arr, 2, 4)必ずしも戻ってくる[[1, 2, 3, 4], [5, 6, 7, 8]と、呼び出しsample(arr, 5, 2)エラーをスローしていました。

編集-おそらくこれは最初の質問では明確ではありませんでした:サンプルは連続した要素のリストでなければなりません。そのため、たとえば、sample(arr, 2, 4)戻ることできますが、返すことでき[[1, 2, 3, 4], [5, 6, 7, 8]ません[[2, 3, 1, 6], [5, 4, 7, 8]

3limin4t0r

最初に、戻り値の形式でリストを作成することから始めることができます。

[ 1,  2,  3,  4,  5,  6,  7,  8]
[<---->, <---->, <---->, <>, <>] // sample(array, 3, 2)
[<------------>, <------------>] // sample(array, 2, 4)

これらのフォーマット配列は、次の長さを使用して書き出すことができます。

[1, 2, 3, 4, 5, 6, 7, 8]
[   2,    2,    2, 1, 1] // sample(array, 3, 2)
[         4,          4] // sample(array, 2, 4)

次に、フォーマット配列をシャッフルして、ランダムなサンプルを選択します。

[1, 2, 3, 4, 5, 6, 7, 8]
[   2, 1,    2,    2, 1] // sample(array, 3, 2)
[         4,          4] // sample(array, 2, 4)

次に、フォーマット配列の各要素についてn、入力配列から最初の要素を削除します。次に、フィラー(配列の長さに達するために配置される1つのサイズのチャンク)でない限り、それらを格納します。

[1, 2, 3, 4, 5, 6, 7, 8]
[[1,2], [4,5], [6,7]]  // sample(array, 3, 2)
[[1,2,3,4], [5,6,7,8]] // sample(array, 2, 4)

最後に、結果のサンプルをシャッフルします。

[1, 2, 3, 4, 5, 6, 7, 8]
[[4,5], [1,2], [6,7]]  // sample(array, 3, 2)
[[5,6,7,8], [1,2,3,4]] // sample(array, 2, 4)

const arr = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(sample(arr, 3, 2));
console.log(sample(arr, 2, 4));
console.log(sample(arr, 5, 2));

function randomInt(limit) {
  return Math.floor(Math.random() * limit);
}

function shuffle(array) {
  for (let limit = array.length; limit > 0; --limit)
    array.push(...array.splice(randomInt(limit), 1));
}

function sample(array, sampleCount, sampleLength) {
  let elementCount = sampleCount * sampleLength;
  if (elementCount > array.length)
    throw "invalid sampleCount/sampleLength arguments";
    
  const filler = {valueOf: () => 1};
  const fillerCount = array.length - elementCount;
  const lengths = Array.from(
    {length: sampleCount + fillerCount},
    (_, i) => i < sampleCount ? sampleLength : filler
  );

  shuffle(lengths);
  const samples = Array.from(array);
  for (const length of lengths) {
    const sample = samples.splice(0, length);
    if (length === filler) continue;
    samples.push(sample);
  }
  shuffle(samples);
  
  return samples;
}

===で重要であることに注意してくださいlength === fillerを使用すると==fillerも等しくなり1ます。これはsample(array, 5, 1)、各サンプルの長さがであるような呼び出しと競合し1ます。

const filler = {valueOf: () => 1};

console.log("1 == filler       //=>", 1 == filler);
console.log("2 == filler       //=>", 2 == filler);
console.log("filler == filler  //=>", filler == filler);
console.log("1 === filler      //=>", 1 === filler);
console.log("2 === filler      //=>", 2 === filler);
console.log("filler === filler //=>", filler == filler);

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

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

編集
0

コメントを追加

0

関連記事

サイズm * nの入力画像X、ブロックサイズTが与えられた場合、サイズT * Tのk個のランダムな重複しないブロックを生成するにはどうすればよいですか?

別の配列のサンプルに基づいて、numpy配列からサンプルを取得します

N個の平均とN個のシグマのリストからN個のサンプルの配列を生成します

2つの異なるサイズのnumpy配列(長さnとm)を追加して、forループを使用せずに* m配列を生成します

R:長さnのベクトルから長さnの2つのランダムな重複しないサンプル(同じインデックスの場合)も取得します

異なるサイズの複数のランダムサンプルを取得します

サイズが定義されていない.DATファイルから複数の配列を抽出します

グループの配列から可能なすべての組み合わせを順番に再帰的に取得します。配列サイズとグループサイズは1-Xで、Xは多数ではありません

可能なペアの数から、元の配列のサイズを取得します

タプル内の整数のみを取得することにより、タプルのアンパックからサイズを取得する配列を形成しようとしています

argv [1]から配列のサイズを取得し、乱数で埋めます

numpy配列から別の配列のサイズの範囲/スライスを取得します

長さKのN個のランダムな重複しない部分文字列を取得します

Rは、n個の要素の文字ベクトルからサイズmのすべての可能な組み合わせを生成します

サイズnのブール配列のすべての可能な方法を作成しますか?

crossingとsample_nを使用して複数の異なるサンプルサイズをサンプリングし、単一のdfを作成します

最初の配列から重複する値なしで2つの配列をループします

不明なサイズの配列を作成しますか?

forループを使用して配列サイズを2倍にし、選択ソートのパフォーマンスをさまざまな配列サイズと比較するにはどうすればよいですか?

numpy配列の固定サイズのランダムサブサンプルを生成します

GoogleSpreadSheetの複数サイズの配列から配列要素を取得する

サブ配列の重複値に基づいて配列アイテムを削除してから、配列を並べ替えます

大きな2DNumPy配列からさまざまなサイズのサブ行を抽出します

フィルタリングされたSQL列から個別の(重複していない)TComboBoxアイテムを追加します

異なるサイズの小さな配列から単一のnumpy配列を構築します

利用可能な用紙サイズのリストから最も近い用紙サイズを取得します

サイズmのスライディングウィンドウを使用して、numpy配列をn個のサブ配列に分割するにはどうすればよいですか?

テーブルベースの複数の列チェックから重複行を削除し、テーブルサイズは同じままです

配列を動的サイズの固定 n 個のチャンクに分割します

TOP 一覧

  1. 1

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  2. 2

    Spring Boot Filter is not getting invoked if remove @component in fitler class

  3. 3

    Python / SciPyのピーク検出アルゴリズム

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  6. 6

    androidsoongビルドシステムによるネイティブコードカバレッジ

  7. 7

    ZScalerと証明書の問題により、Dockerを使用できません

  8. 8

    VisualStudioコードの特異点/ドッカー画像でPythonインタープリターを使用するにはどうすればよいですか?

  9. 9

    ビュー用にサイズ変更した後の画像の高さと幅を取得する方法

  10. 10

    二次導関数を数値計算するときの大きな誤差

  11. 11

    Ansibleで複数行のシェルスクリプトを実行する方法

  12. 12

    画像変更コードを実行してもボタンの画像が変更されない

  13. 13

    Reactでclsxを使用する方法

  14. 14

    Three.js indexed BufferGeometry vs. InstancedBufferGeometry

  15. 15

    __init__。pyファイルの整理中に循環インポートエラーが発生しました

  16. 16

    PyTesseractを使用した背景色のため、スクリーンショットからテキストを読み取ることができません

  17. 17

    値間の一致を見つける最も簡単な方法は何ですか

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    三項演算子良い練習の代わりとしてOptional.ofNullableを使用していますか?

  20. 20

    好き/愛の関係のためのデータベース設計

  21. 21

    エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

ホットタグ

アーカイブ