[python] numpy.arrayの形状(R、1)と(R、)の差



Answers

(R,)(1,R)の違いは、文字通り、使用する必要があるインデックスの数です。 ones((1,R))は、たまたま1つの行しか持たない2次元配列です。 ones(R)はベクトルです。 一般的に、変数が複数の行/列を持つことに意味がない場合は、シングルトン次元の行列ではなくベクトルを使用する必要があります。

具体的なケースについては、いくつかのオプションがあります:

1)2番目の引数をベクトルにするだけです。 以下はうまくいきます:

    np.dot(M[:,0], np.ones(R))

2)matlabのような行列操作をしたい場合は、 ndarray代わりにclass matrixndarrayます。 すべての行列は2-D配列に強制され、演算子*は要素単位ではなく行列乗算を行います(ドットは必要ありません)。 私の経験では、これはそれが価値があるより多くのトラブルですが、あなたがmatlabに慣れているといいかもしれません。

Question

numpyでは、いくつかの演算は形状(R, 1)戻りますが、何らかのリターン(R,)戻ります。 これにより、明示的なreshapeが必要となるため、行列乗算がより退屈になります。 例えば、行列M与えられたとき、 numpy.dot(M[:,0], numpy.ones((1, R)))を実行したい場合numpy.dot(M[:,0], numpy.ones((1, R)))は行の数です(もちろん、列方向に発生する)。 M[:,0]は形状(R,)が、 numpy.ones((1, R))は形状(1, R)ため、 matrices are not aligned誤差をmatrices are not aligned

だから私の質問は:

  1. 形状(R, 1)(R,)の違いは何ですか? 私は文字通りそれが数字のリストであり、すべてのリストが数字だけを含むリストのリストを知っています。 なぜ簡単な行列乗算のために(R,)代わりに形状(R, 1)好むようにnumpy設計しないのだろうかと疑問に思います。

  2. 上の例の方が良い方法がありますか? numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))このように明示的に再構成することなくnumpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))




1) (R, 1)上に(R, 1)形を好まない理由は、不必要に複雑なことである。 さらに、なぜ(1, R)代わりに長さ-Rのベクトルのためにデフォルトで形状(R, 1)を持つことが望ましいのでしょうか? 追加のディメンションが必要な場合は、それを単純なままにして明示的に指定することをお勧めします。

2)あなたの例では、外側の製品を計算しているので、 np.outerを使ってreshape呼び出しをせずにこれを行うことができます:

np.outer(M[:,0], numpy.ones((1, R)))



Links