0

次のような派手なデータ構造があります。

[[['diaad'],
  ['iaadf'],
  ['aadfe'],
  ['hedbb'],
  ['edbbb'],
  ['dbbbb']],

 [['gegec'],
  ['ehecf'],
  ['gecfc'],
  ['gadff'],
  ['adfef'],
  ['dffgc']],

 [['ddddj'],
  ['dddjd'],
  ['ddjdd'],
  ['jfffd'],
  ['fgfdb'],
  ['ggdbb']]]

これは次のようにインスタンス化されます:

>>> a = np.array([[['diaad'], ['iaadf'],  ['aadfe'],  ['hedbb'],  ['edbbb'],  ['dbbbb']], [['gegec'],  ['ehecf'],  ['gecfc'],  ['gadff'],  ['adfef'],  ['dffgc']], [['ddddj'],  ['dddjd'],  ['ddjdd'],  ['jfffd'],  ['fgfdb'],  ['ggdbb']]])

numpyペアワイズ要素に対してカスタム関数を計算する直接的な方法はありますか?

たとえば、私のカスタム関数が呼び出されたとしprocessPair(a,b)ます。列に沿ったすべてのペアワイズ要素、つまり と の間の結果を計算する必要が('diaad', 'gegec')あり('gegec', 'ddddj')ます('diaad', 'ddddj')。これを行うことに関する提案はありますか?関数がこれを達成できると思っていましたmapが、その方法は完全にはわかりません。

4

1 に答える 1

1

これが私の解決策です。私はそれに完全に満足しているわけではありません-もっとエレガントにできるはずだと思います-しかし、うまくいきます:

from itertools import combinations

def apply_pairwise(func, a):
    "For each row, call func with every possible combination of two values"

    stack = []
    for col_a, col_b in combinations(range(a.shape[0]), 2):
        stack.append(np.hstack([a[col_a], a[col_b]]))

    combined = np.vstack(stack)

    def unpack_row(row):
        "Calls func with the values of a given numpy array as arguments"
        return func(*row.tolist())

    return np.apply_along_axis(unpack_row, 1, combined)

次のように使用します (例の配列aが定義されていると仮定します):

>>> f = lambda x, y: x + y
>>> print apply_pairwise(f, a)
['diaadgegec' 'iaadfehecf' 'aadfegecfc' 'hedbbgadff' 'edbbbadfef'
'dbbbbdffgc' 'diaadddddj' 'iaadfdddjd' 'aadfeddjdd' 'hedbbjfffd'
'edbbbfgfdb' 'dbbbbggdbb' 'gegecddddj' 'ehecfdddjd' 'gecfcddjdd'
'gadffjfffd' 'adfeffgfdb' 'dffgcggdbb']
于 2012-06-28T10:13:53.243 に答える