5

形状の異なる 2 つの numpy 配列を追加したいのですが、ブロードキャストを行わずに、「欠落している」値はゼロとして扱われます。次のような例でおそらく最も簡単です

[1, 2, 3] + [2] -> [3, 2, 3]

また

[1, 2, 3] + [[2], [1]] -> [[3, 2, 3], [1, 0, 0]]

形は事前にわかりません。

それぞれの np.shape の出力をいじり、両方を保持する最小の形状を見つけようとし、それぞれをその形状のゼロ配列に埋め込んでから追加します。しかし、かなり手間がかかるようですが、もっと簡単な方法はありますか?

前もって感謝します!

編集:「多くの作業」とは、機械ではなく「私にとって多くの作業」を意味し、効率よりも優雅さを求めています。両方を保持する最小の形状を得るための私の努力は

def pad(a, b) :
    sa, sb = map(np.shape, [a, b])
    N = np.max([len(sa),len(sb)])
    sap, sbp = map(lambda x : x + (1,)*(N-len(x)), [sa, sb])
    sp = np.amax( np.array([ tuple(sap), tuple(sbp) ]), 1)

かわいくない:-/

4

3 に答える 3

1

これは私が思いつくことができる最高のものです:

import numpy as np

def magic_add(*args):
    n = max(a.ndim for a in args)
    args = [a.reshape((n - a.ndim)*(1,) + a.shape) for a in args]
    shape = np.max([a.shape for a in args], 0)
    result = np.zeros(shape)

    for a in args:
        idx = tuple(slice(i) for i in a.shape)
        result[idx] += a
    return result

次のように、結果に予想される次元数がわかっている場合は、for ループを少しクリーンアップできます。

for a in args:
    i, j = a.shape
    result[:i, :j] += a
于 2013-04-24T17:02:51.253 に答える