4

大規模なコード ベースでは、np.broadcast_to配列をブロードキャストするために使用しています (ここでは単純な例を使用しています)。

In [1]: x = np.array([1,2,3])

In [2]: y = np.broadcast_to(x, (2,1,3))

In [3]: y.shape
Out[3]: (2, 1, 3)

コードの他の場所では、Numpy 配列に対してベクトル化された方法で操作できるが、ufunc ではないサードパーティ関数を使用しています。これらの関数はブロードキャストを理解していません。つまり、配列のような関数を呼び出すのyは非効率的です。Numpy のようなソリューションは、ブロードキャストを理解している一方で、配列要素にループvectorizeを導入し、非常に非効率的であるため、良くありません。for

理想的には、私ができるようにしたいのは、unbroadcast必要に応じてフルサイズにブロードキャストできる最小形状の配列を返す、たとえば と呼ぶことができる関数を持つことです。例えば:

In [4]: z = unbroadcast(y)

In [5]: z.shape
Out[5]: (1, 1, 3)

次に、サードパーティ関数を で実行しz、結果を にブロードキャストしy.shapeます。

unbroadcastNumpy のパブリック API に依存する実装方法はありますか? そうでない場合、望ましい結果を生み出すハックはありますか?

4

2 に答える 2

4

考えられる解決策があるので、ここに投稿します (ただし、より良い解決策がある場合は、お気軽に返信してください!)。strides1 つの解決策は、ブロードキャストされた次元に沿って 0 になる配列の引数を確認することです。

def unbroadcast(array):
    slices = []
    for i in range(array.ndim):
        if array.strides[i] == 0:
            slices.append(slice(0, 1))
        else:
            slices.append(slice(None))
    return array[slices]

これは与える:

In [14]: unbroadcast(y).shape
Out[14]: (1, 1, 3)
于 2016-11-28T13:56:57.543 に答える