4

共通のインデックスを持つさまざまなサイズの配列がいくつかあります。

例えば、

Arr1 = np.arange(0, 1000, 1).reshape(100, 10)
Arr2 = np.arange(0, 500, 1).reshape(100,5)

Arr1.shape = (100, 10)
Arr2.shape = (100, 5)

これらを一緒に、3次元の新しい配列Arr3に追加したいと思います。例えば

Arr3 = Arr1 + Arr2
Arr3.shape = (100, 10, 5)

この場合、値は一致している必要があることに注意してください。

Arr3[10, 3, 2] =  Arr1[10, 3] + Arr2[10, 2]

私は次の方法を使おうとしています

test = Arr1.copy()
test = test[:, np.newaxis] + Arr2

これで、2つの正方行列を足し合わせたときにこれを機能させることができました。

m = np.arange(0, 100, 1)
[x, y] = np.meshgrid(x, y)
x.shape = (100, 100)

test44 = x.copy()
test44 = test44[:, np.newaxis] + x
test44.shape = (100, 100, 100)
test44[4, 3, 2] = 4
x[4, 2] = 2
x[3, 2] = 2

ただし、実際のプログラムでは、この問題の正方行列はありません。さらに、この方法は、次のように次元数を増やし始めるとわかるように、非常にメモリを消費します。

test44 = test44[:, :, np.newaxis] + x
test44.shape = (100, 100, 100, 100)

# Note this next command will fail with a memory error on my computer.
test44 = test44[:, :, :, np.newaxis] + x

したがって、私の質問には2つの部分があります。

  1. 共通の「共有」軸を持つ2つの異なる形状の2Dアレイから3Dアレイを作成することは可能ですか?
  2. そのような方法は、より高次の次元で拡張可能ですか?

どんな援助も大歓迎です。

4

1 に答える 1

4

はい、あなたがやろうとしていることはブロードキャストと呼ばれます。入力が正しい形である場合、それはnumpyによって自動的に行われます。これを試して:

Arr1 = Arr1.reshape((100, 10, 1))
Arr2 = Arr2.reshape((100, 1, 5))
Arr3 = Arr1 + Arr2

これは、この種の動作をn次元に拡張する方法を示す、放送の非常に優れた入門書であることがわかりました。

于 2013-02-26T00:31:34.447 に答える