scores
一部のオブジェクトに関連付けられたスコアの 1 次元の numpy 配列があります。これらのオブジェクトはいくつかの互いに素なグループに属しており、最初のグループのすべての項目のスコアが最初で、2 番目のグループの項目のスコアが続きます。
各行がグループに対応し、各エントリがその項目の 1 つのスコアである 2 次元配列を作成したいと思います。すべてのグループが同じサイズの場合、次のことができます。
scores.reshape((numGroups, groupSize))
残念ながら、私のグループの規模はさまざまです。numpy が不規則な配列をサポートしていないことは理解していますが、結果の配列が指定された値で各行を単純に埋めて、すべての行を同じ長さにするのであれば問題ありません。
これを具体的にするためにA
、3 つのアイテム、B
2 つのアイテム、C
4 つのアイテムを設定したとします。
scores = numpy.array([f(a[0]), f(a[1]), f(a[2]), f(b[0]), f(b[1]),
f(c[0]), f(c[1]), f(c[2]), f(c[3])])
rowStarts = numpy.array([0, 3, 5])
paddingValue = -1.0
scoresByGroup = groupIntoRows(scores, rowStarts, paddingValue)
の望ましい値は次のscoresByGroup
ようになります。
[[f(a[0]), f(a[1]), f(a[2]), -1.0],
[f(b[0]), f(b[1]), -1.0, -1.0]
[f(c[0]), f(c[1]), f(c[2]), f(c[3])]]
作成に使用できるnumpy関数または関数の構成はありますgroupIntoRows
か?
バックグラウンド:
- この操作は、Theano の勾配降下アルゴリズムのミニバッチの損失を計算する際に使用されるため、ネイティブ Python に頼るのではなく、可能であれば numpy 関数の構成として保持する必要があります。
- 既知の最大行サイズがあると仮定しても問題ありません
- スコアリングされる元のオブジェクトはベクトルであり、スコアリング関数は行列の乗算です。これが、最初に物事を平坦化する理由です。行列の乗算を行う前に、アイテム セットの最大サイズまですべてをパディングすることは可能ですが、最大のセットは平均セット サイズの 10 倍を超えるため、これは速度上の理由から望ましくありません。