<p>numpy.concatはブロードキャスト軸間で機能していないようです(Trac#1518)</p>

作成日 2012年10月19日  ·  11コメント  ·  ソース: numpy/numpy

_unknownに割り当てられたtracユーザーeobによる2010-06-22の元のチケットhttp://projects.scipy.org/numpy/ticket/1518。_

2つのテンソルを連結しようとすると、連結操作では、そのうちの1つでブロードキャストディメンション(newaxisを使用)を使用できません。

00 - Bug Other

最も参考になるコメント

私には確かに思える解決策を見つけました... np.concatenate(np.broadcast_arrays(*arrays), axis=...)形式でbroadcast_arraysを使用するだけです。 例: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

全てのコメント11件

_tracユーザーeobは2010-06-22_に書き込みました

注:使用している回避策は、newaxisを使用したいnumpy.arrayを並べて表示することです。これは機能しますが、メモリが犠牲になります。

_ @pvは2010-06-24_に書き込みました

何をしようとしているのか、何をしたいのか、実際に何が起こっているのかを示す、自己完結型のサンプルコードを記述できますか。

あなたの説明から、あなたが物事をどのように機能させたいかは私には完全には明らかではありません。

_ @pvは2010-06-24_に書き込みました

これを意味するなら、

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, np.tile(x, (4,1))), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])

あなたはコピーなしでそれを行うことができます:

def broadcast_view(x, ref):
    """Broadcast unit dimensions in `x` to match those in `ref` without copies"""
    strides = [0 if x.shape[j] == 1 else x.strides[j] for j in range(x.ndim)]
    shape = [ref.shape[j] if x.shape[j] == 1 else x.shape[j] for j in range(x.ndim)]
    from numpy.lib.stride_tricks import as_strided
    return as_strided(x, shape=shape, strides=strides)

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, broadcast_view(x[None,:], y)), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])
>>> broadcast_view(x[None,:], y).base.base.base is x
True

しかし、はい、 np.concatenateはこれを自動的に行う必要があると思います。

放送をサポートするnp.concatenateに関するニュース/進捗状況はありますか?

これについては過去にリストでいくつかの議論があり、集合的な知恵は、連結操作でのブロードキャストは、有用な機能よりも意図しない間違いを隠す可能性が高いことを示しました。 おそらくこれを閉じる必要があります。

いずれにせよ、その会話を再び盛り上げたいのであれば、適切な場所はここではなくメーリングリストです。

これは「修正されない」として閉じる必要がありますか?

同意しました。 Broadcast_toがあるため、手動ブロードキャストが少し簡単になりました。

私はほんの少しの前向きな補強が必要でした、それは閉じました。 誰かがこれに対して強い意見を持っているなら、気軽に再開してください。

私には確かに思える解決策を見つけました... np.concatenate(np.broadcast_arrays(*arrays), axis=...)形式でbroadcast_arraysを使用するだけです。 例: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

@davidmashburnこのソリューションには問題があると思います(そして、このスレッドの他の人が示唆しているように、一般的に手動ブロードキャストに問題があります)。 私たちが連結する次元で放送することは意味がないと思います。 言い換えれば、あなたの場合、私はゼロの1つの列で終わることを期待するだけです。

他の誰かがこの問題を見つけた場合、連結でのブロードキャストの解決策を探しているときに、 https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019に解決策を投稿しました

このページは役に立ちましたか?
0 / 5 - 0 評価