0

次のコードを考えると、最後の2行は同じように動作すると思いますが、そうではありません。

import numpy as np

C = np.matrix(np.zeros((4,4)))
C[0, 0:2] = np.matrix([[1, 2]]) # Works as expected.
C[0, [0,1]] = np.matrix([[1, 2]]) # Throws an "array is not broadcastable to correct shape" error.

代わりに使用するndarrayと、期待どおりに機能します(割り当ての右側を1次元に調整しますndarray)。

D = np.zeros((4,4))
D[0, 0:2] = np.array([1, 2]) # Works as expected.
D[0, [0,1]] = np.array([1, 2]) # Works too.

さらに奇妙なことに、マトリックスにインデックスを付けるのではなく、マトリックスにインデックスを付けるだけの場合はC、スライスインデックスを使用するか、リストが同じものを返すように見えます。

C[0, 0:2] # => matrix([[ 1.,  2.]])
C[0, [0, 1]] # => matrix([[ 1.,  2.]])

問題は、割り当てにおける2つのアプローチの動作が異なるのはなぜですか?私は何が欠けていますか?

(編集:タイプミス)

4

2 に答える 2

2

numpyのバグのようです:http://projects.scipy.org/numpy/ticket/803。解決策は、選択した要素に行列を割り当てる代わりに、通常のリストまたはnumpy配列を割り当てることです。

于 2012-09-23T08:02:24.493 に答える
-1

編集:私が書いたことは真実ですが、 (配列の場合は)とD[0,0:2] = ...は異なるという事実D[0,[0,1]] = ...は、おそらく実際の矛盾(および関連)であることを認識しなければなりませんでした。

たぶん、私が見る限り、なぜこれが起こるのかについての説明です。これをチェックして:

D[0,[0,1]] = np.array([[1,2]])

同じエラーが発生します。重要なのは、マトリックス形状が再び2Dに「固定」される前に、内部的にスライス操作が行われることです。これmatrixは、新しいビューが作成されるたびにサブクラスが発生するためですが、ここでは、通常は不要なビューは作成されません。

これは、このような要素を設定する場合、常に次のように動作することを意味します。

C.A[0,[0,1]] = matrix([[1,2]])  # Note the C.A giving normal array view of C.

マトリックスは2Dであるが、1Dであるため(マトリックスオブジェクトによって少なくとも2Dに「固定」されていないため)、これは失敗します。C.A[0,[0,1]]この場合、右手から1次元の軸を削除するだけなので、次のように言えます。 side numpyはそれを許容できるかもしれませんが、そうでない限り、マトリックスオブジェクトは、おそらくあまりエレガントではない、インプレース/割り当て演算子の完全なカスタムセットを作成する必要があります。

しかし、多分C.A、などの使用はこの不便を回避するのに役立つかもしれません。ただし、一般的な注意点として、numpyでは、行列の乗算などを大量に行う場合を除いて、常に基本クラスの配列を使用することをお勧めします(この場合、プログラムの一部に限定されている場合は、表示する方がよいでしょう。その前の行列としての配列ですが、残りの配列で機能します)

于 2012-09-23T09:00:48.457 に答える