インデックスの合計が何らかの値になるすべてのエントリに割り当てる

H.Rappeport

X2進数と形状の配列(2, 2, ..., 2)あり、インデックスの合計が2を法として0になり、残りのエントリに値0が割り当てられるすべてのエントリに値1を割り当てたいと思います。

たとえば、他の4つのエントリX.shape = (2, 2, 2)に1を割り当てX[0, 0, 0], X[0, 1, 1], X[1, 0, 1], X[1, 1, 0]、0を割り当てたいとします。

これを行う最も効率的な方法は何ですか?この配列はnp.boolデータ型で作成する必要があると思います。そのため、ソリューションはそれを念頭に置いて機能するはずです。

ポールパンツァー

ここに直接法とトリッキーな方法があります。トリッキーなものはビットパッキングを使用し、特定の反復パターンを利用します。大規模な場合、nこれによりかなりのスピードアップが得られます(>50 @ n=19)。

import functools as ft
import numpy as np

def direct(n):
    I = np.arange(2, dtype='u1')
    return ft.reduce(np.bitwise_xor, np.ix_(I[::-1], *(n-1)*(I,)))

def smartish(n):
    assert n >= 6
    b = np.empty(1<<(n-3), 'u1')
    b[[0, 3, 5, 6]] = 0b10010110
    b[[1, 2, 4, 7]] = 0b01101001
    i = b.view('u8')
    jp = 1
    for j in range(0, n-7, 2):
        i[3*jp:4*jp] = i[:jp]
        i[jp:3*jp].reshape(2, -1)[...] = 0xffff_ffff_ffff_ffff ^ i[:jp]
        jp *= 4
    if n & 1:
        i[jp:] = 0xffff_ffff_ffff_ffff ^ i[:jp]
    return np.unpackbits(b).reshape(n*(2,))

from timeit import timeit

assert np.all(smartish(19) == direct(19))

print(f"direct   {timeit(lambda: direct(19), number=100)*10:.3f} ms")
print(f"smartish {timeit(lambda: smartish(19), number=100)*10:.3f} ms")

2^19ボックスでのサンプル実行

direct   5.408 ms
smartish 0.079 ms

これらは次のようなuint8配列を返すことに注意してください

>>> direct(3)
array([[[1, 0],
        [0, 1]],

       [[0, 1],
        [1, 0]]], dtype=uint8)

しかし、これらはbool実質的にゼロコストでビューキャストすることができます

>>> direct(3).view('?')
array([[[ True, False],
        [False,  True]],

       [[False,  True],
        [ True, False]]])

説明者:

直接法:ビットパリティをチェックする簡単な方法の1つはxor、ビットをまとめることです。これを「削減」する方法で行う必要があります。つまりxor、最初の2つのオペランド、次に結果と3番目のオペランド、次にその結果と4番目のオペランドなどに2項演算を適用する必要がありますこれが何をするかfunctools.reduceです。

また、これを1回だけではなく、2^nグリッドの各ポイントで実行します。これnumpyを行う方法は、オープングリッドです。これらは、を使用して、np.ix_または単純な場合はを使用して、1D軸から生成できますnp.ogrid反転パリティが必要であるという事実を説明するために、最初の軸を反転することに注意してください。

賢い方法。2つの主要な最適化を行います。1)xorはビット単位の演算です。つまり、ビットを64ビットのuintにパックすると、「64ウェイ並列計算」が無料で実行されます。2)2 ^ n超立方体を平坦化すると、線形配置の位置nは、超立方体のセル(bit1、bit2、bit3、...)に対応します。ここで、bit1、bit2などはのバイナリ表現(先行ゼロ付き)です。 n。ここで、位置0 .. 0b11..11 = 2 ^ k-1のパリティを計算した場合、コピーして反転するだけで2 ^ k..2 ^(k + 1)-1のパリティを取得できることに注意してください。すでに計算されたパリティ。たとえば、k = 2:

0b000, 0b001, 0b010, 0b011 would be what we have and
0b100, 0b101, 0b110, 0b111 would be what we need to compute
  ^      ^      ^      ^   

これらの2つのシーケンスはマークされたビットのみが異なるため、実際にそれらの桁間の合計が1つ異なり、パリティが反転していることは明らかです。

演習として、次の2 ^ kエントリとその後の2 ^ kエントリについて同様の流れで何が言えるかを考えます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ベクトルの場合、すべての値が NA (または何らかの値) になるインデックスを決定します。

分類Dev

リストの最初のインデックスに値を割り当てると、値が変わるのはなぜですか?

分類Dev

すべてのリクエストにレトロフィットインスタンスがある場合はどうなりますか?

分類Dev

インデックスが1つだけ更新されると、Pythonのnumpyzeros配列にすべての値に1が割り当てられます

分類Dev

group by行に存在する値がグループ行に同じものを割り当てるか、外部から最大値を割り当ててインクリメントする場合、パンダデータフレームgroupby a col

分類Dev

この反復的なリスト成長コードはなぜIndexError:リスト割り当てインデックスが範囲外になるのですか?

分類Dev

配列内の他のすべてのインデックスに値を割り当てる

分類Dev

(グループ化された場合)合計が特定の値になる日付のすべての行インデックスを検索します

分類Dev

Bash-任意のインデックスから始めて、リストを配列に割り当てる方法

分類Dev

監視可能なHTTPリクエストのサブスクライブから角度コンポーネントの変数に値を割り当てる

分類Dev

Pythonの値の範囲が異なる3つのリストの中から条件に応じて最適なインデックスを選択する

分類Dev

インデックスのリストを使用して別のリストから削除すると、インデックスが範囲外のエラーになります-なぜですか?

分類Dev

Pythonのすべての組み合わせのリストにあるインデックスから要素の組み合わせを知る方法

分類Dev

インデックスによる配列リスト内の項目への値の割り当て

分類Dev

テキストをベクトルに分割する方法。各エントリは、一意の各単語に割り当てられたインデックス値に対応しますか?

分類Dev

Googleデータストアのプロパティ配列の個々の値のみにインデックスを付ける(これらの値のすべての組み合わせにインデックスを付けるのではなく)

分類Dev

Firestore-マップのすべてのエントリに複合インデックスを作成するにはどうすればよいですか?

分類Dev

Firestore-マップのすべてのエントリに複合インデックスを作成するにはどうすればよいですか?

分類Dev

KeyError: '[]インデックスにない'インデックスの割り当てによってパンダの列の名前を変更する場合

分類Dev

Xより大きいインデックスを持つすべての値を合計するにはどうすればよいですか?

分類Dev

beautifulsoupのインデックス値(htmlリンクとテキスト)をpanda htmlDataFrameに割り当てる

分類Dev

リストの値をそれらのインデックスの累乗に合計する方法

分類Dev

2つのdfのインデックスが異なる場合の値の割り当て

分類Dev

新しい列に新しい値を割り当てながら、開始値と終了値のリストに基づいてインデックスをループする方法

分類Dev

使用されているインデックスにクエリのすべてのフィールドが含まれている場合でも、MongoDBが並べ替え後にディスクからドキュメントをフェッチする理由

分類Dev

Numpy:インデックスのリストを使用して2次元配列に値を割り当てる

分類Dev

インデックスの後に1つの値を持つリストを割り当てる

分類Dev

ネストされたリストが特定のインデックスに値を持っているかどうかをチェックするエレガントな方法は何ですか?

分類Dev

public ipなしですべてのトラフィックをインスタンスに開放する外部からのリスクはありますか?

Related 関連記事

  1. 1

    ベクトルの場合、すべての値が NA (または何らかの値) になるインデックスを決定します。

  2. 2

    リストの最初のインデックスに値を割り当てると、値が変わるのはなぜですか?

  3. 3

    すべてのリクエストにレトロフィットインスタンスがある場合はどうなりますか?

  4. 4

    インデックスが1つだけ更新されると、Pythonのnumpyzeros配列にすべての値に1が割り当てられます

  5. 5

    group by行に存在する値がグループ行に同じものを割り当てるか、外部から最大値を割り当ててインクリメントする場合、パンダデータフレームgroupby a col

  6. 6

    この反復的なリスト成長コードはなぜIndexError:リスト割り当てインデックスが範囲外になるのですか?

  7. 7

    配列内の他のすべてのインデックスに値を割り当てる

  8. 8

    (グループ化された場合)合計が特定の値になる日付のすべての行インデックスを検索します

  9. 9

    Bash-任意のインデックスから始めて、リストを配列に割り当てる方法

  10. 10

    監視可能なHTTPリクエストのサブスクライブから角度コンポーネントの変数に値を割り当てる

  11. 11

    Pythonの値の範囲が異なる3つのリストの中から条件に応じて最適なインデックスを選択する

  12. 12

    インデックスのリストを使用して別のリストから削除すると、インデックスが範囲外のエラーになります-なぜですか?

  13. 13

    Pythonのすべての組み合わせのリストにあるインデックスから要素の組み合わせを知る方法

  14. 14

    インデックスによる配列リスト内の項目への値の割り当て

  15. 15

    テキストをベクトルに分割する方法。各エントリは、一意の各単語に割り当てられたインデックス値に対応しますか?

  16. 16

    Googleデータストアのプロパティ配列の個々の値のみにインデックスを付ける(これらの値のすべての組み合わせにインデックスを付けるのではなく)

  17. 17

    Firestore-マップのすべてのエントリに複合インデックスを作成するにはどうすればよいですか?

  18. 18

    Firestore-マップのすべてのエントリに複合インデックスを作成するにはどうすればよいですか?

  19. 19

    KeyError: '[]インデックスにない'インデックスの割り当てによってパンダの列の名前を変更する場合

  20. 20

    Xより大きいインデックスを持つすべての値を合計するにはどうすればよいですか?

  21. 21

    beautifulsoupのインデックス値(htmlリンクとテキスト)をpanda htmlDataFrameに割り当てる

  22. 22

    リストの値をそれらのインデックスの累乗に合計する方法

  23. 23

    2つのdfのインデックスが異なる場合の値の割り当て

  24. 24

    新しい列に新しい値を割り当てながら、開始値と終了値のリストに基づいてインデックスをループする方法

  25. 25

    使用されているインデックスにクエリのすべてのフィールドが含まれている場合でも、MongoDBが並べ替え後にディスクからドキュメントをフェッチする理由

  26. 26

    Numpy:インデックスのリストを使用して2次元配列に値を割り当てる

  27. 27

    インデックスの後に1つの値を持つリストを割り当てる

  28. 28

    ネストされたリストが特定のインデックスに値を持っているかどうかをチェックするエレガントな方法は何ですか?

  29. 29

    public ipなしですべてのトラフィックをインスタンスに開放する外部からのリスクはありますか?

ホットタグ

アーカイブ