5

d最初に対角線を指定し、次に。を使用して一連の行列-ベクトル乗算を実行することによって作成される対角行列適用関数を実装したいと思いますx。もちろん、必要なのは要素ごとのベクトル乗算だけなので、実際の行列を作成したくはありません。

ここで、一部のユーザーは形状の対角線、一部の形状を提供しようとしてd(k,)ます(k,1)。また、x(k,)をとることができます(k,1)*結果が入力と同じ形になるという点で、apply()メソッドをfornumpy行列と同じように動作させたいと思いますx

したがって、質問:Python / Numpyでは、2つのnp.arrayxy形状を要素ごとに乗算する方法、(k,)または(k,1)(任意の組み合わせで)結果の配列が次の形状になるようにする方法はありxますか?

私は少し実験しました[:,None]

x = np.empty((4,1))
y = np.empty(4)
(x * y).shape         # (4,4)  -- nope
(y * y).shape         # (4,)   -- yes
(x * y[:,None]).shape # (4, 1) -- yes
(y * y[:,None]).shape # (4,4)  -- nope

確かにコードをでラップすることはできますがif len(x.shape)==...:、それはあまりPython的ではありません。

提案?

4

2 に答える 2

5

私はあなたの質問を理解したので、私の提案は単に形を変えることです。呼び出すreshapeとビューが返されるため、大きなコピーコストなどは発生しません。配列の形状を変更し、乗算して、再度形状を変更するだけです。

>>> def shape_preserving_mult(x, y):
...     return (x.reshape((-1,)) * y.reshape((-1))).reshape(x.shape)
... 

またはもっと簡潔に、あなたとrroowwllaannddが指摘したように:

>>> def shape_preserving_mult(x, y):
...     return x * y.reshape(x.shape)
... 
>>> shape_preserving_mult(x, y)
array([[ 0],
       [ 1],
       [ 4],
       [ 9],
       [16]])
>>> shape_preserving_mult(x, y.T)
array([[ 0],
       [ 1],
       [ 4],
       [ 9],
       [16]])
>>> shape_preserving_mult(x.T, y)
array([[ 0,  1,  4,  9, 16]])
>>> shape_preserving_mult(x.T, y.T)
array([[ 0,  1,  4,  9, 16]])

私の以前の提案の内容は以下に残っています。

(1, 4)形の多数の配列に形の配列を掛けると、(4,)必要なものに近いものが得られることに注意してください。

>>> x = numpy.arange(5).reshape((5, 1))
>>> y = numpy.arange(5)
>>> x.shape
(5, 1)
>>> x.T.shape
(1, 5)
>>> y * x.T
array([[ 0,  1,  4,  9, 16]])

これはの形ではありませんが、の形をaしていますa.T。いつでもT結果を再度呼び出すことができます。(5,)1次元配列での転置操作では変更が発生しないため、これは形状の配列でも機能します。したがって、おそらくこれを行うことができます:

>>> def transposed_mult(x, y):
...     return (x.T * y).T
... 
>>> transposed_mult(x, y)
array([[ 0],
       [ 1],
       [ 4],
       [ 9],
       [16]])

しかしもちろん、形状の配列を渡すと、これは逆の問題を引き起こします(1, 5)

>>> transposed_mult(x.T, y)
array([[ 0,  0,  0,  0,  0],
       [ 0,  1,  2,  3,  4],
       [ 0,  2,  4,  6,  8],
       [ 0,  3,  6,  9, 12],
       [ 0,  4,  8, 12, 16]])

元の投稿で要求したとおりのことも同様ですが、さらに柔軟transposed_mult性が必要な場合は、期待どおりに機能しません。そして確かに、それはあなたが追加の柔軟性を必要としているようです。

于 2012-04-22T13:05:39.670 に答える
3

xとが両方とも本質的に1D配列であると想定できる場合は、ynumpyの.flatten()配列メソッドを使用します。

>>> result=x.flatten()*y.flatten()

1D配列を返す必要があります:

>>> result.shape
(4,)

あなたの形を維持するためにx、次のことができます:

>>> result = x*y.reshape(x.shape)
>>> result.shape
(4,1)
于 2012-04-22T12:59:24.357 に答える