2013-04-23 7 views
5

異なる形状の2つの配列を追加したいが、放送しないで、「欠落している」値はゼロとして扱われる。形の異なる配列を追加する

[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) 
です

ないきれい: -/

答えて

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 
+0

ありがとう、それはかなり滑らかです – n00b

4

私はのゼロ編の配列内の各を埋め込む、それらの両方を保持している最小の形状を見つけようと、それぞれのnp.shapeの出力いじりですそのシェイプを追加して追加します。しかし、それはむしろたくさんの仕事のようですが、より簡単な方法はありますか?

取得np.shapeある些細な、両方のは非常に簡単で、追加もちろん、保持している最小の形状を見つけることである些細な、「多くの作業」のみが一部であるように、「ゼロ編の各を埋め込みますその形状の配列 "となる。

はい、除外するには、resizeメソッド(または、代わりにコピーを作成する場合はresize関数)を呼び出します。ドキュメントが説明したよう:

は、配列を拡大する:...不足しているエントリは例えばゼロ

で満たされているあなたは、静的次元を知っていれば、:

>>> a1 = np.array([[1, 2, 3], [4, 5, 6]]) 
>>> a2 = np.array([[2], [2]]) 
>>> shape = [max(a.shape[axis] for a in (a1, a2)) for axis in range(2)] 
>>> a1.resize(shape) 
>>> a2.resize(shape) 
>>> print(a1 + a2) 
array([[3, 4, 3], 
     [4, 5, 6]]) 
+0

ここで正しいサイズにしないと、 'a2.resize(4、4)'を試してみてください。また、入力のディメンションが異なる場合は、これも失敗します。 –