14

Python で、サイズnxnnumpyの正方行列Xと、サイズ n のベクトル a があるとしますnumpy

非常に簡単に言えば、 X - aのブロードキャスト減算を実行したいのですが、軸0または軸1のいずれかに沿って減算を指定できるように、どの次元に沿って指定できるようにしたいのですか?

軸の指定方法を教えてください。

4

2 に答える 2

9

異なる 2 つのディメンションから始めます (少なくともラベル内)。

  • X(n,m)
  • a(n,)
  • b(m,)

これらを組み合わせる方法は次のとおりです。

(n,m)-(n,) => (n,m)-(n,1) => (n,m)
X - a[:,None]     

(n,m)-(m,) => (n,m)-(1,m) => (n,m)
X - b[None,:]
X - b      # [None,:] is automatic, if needed.

基本的なポイントは、数値の次元が異なる場合、numpy最初に新しい次元を追加できますが、最後に新しい次元を追加することについて明示する必要があるということです。

または、外積 (差) で 2 つの 1 次元配列を組み合わせるには:

(n,) - (m,) => (n,1)-(1,m) => (n,m)
a[:,None] - b[None,:]
a[:,None] - b

これらのルールがないと、またはまたは何か他a-bの結果になる可能性があります。(n,m)(m,n)

そして、2 つの一致する長さの配列:

(n,) - (n,) => (n,)
a - a

また

(n,) - (n,) => (n,1)-(1,n) => (n,n)
a[:,None]-a[None,:]

=============

パラメーターを取る関数を作成するにはaxis、次を使用できますnp.expand_dims

In [220]: np.expand_dims([1,2,3],0)
Out[220]: array([[1, 2, 3]])    # like [None,:]
In [221]: np.expand_dims([1,2,3],1)
Out[221]:             # like [:,None]
array([[1],
       [2],
       [3]])

def foo(X, a, axis=0):
    return X - np.expand_dims(a, axis=axis)

次のように使用します。

In [223]: foo(np.eye(3),[1,2,3],axis=0)
Out[223]: 
array([[ 0., -2., -3.],
       [-1., -1., -3.],
       [-1., -2., -2.]])
In [224]: foo(np.eye(3),[1,2,3],axis=1)
Out[224]: 
array([[ 0., -1., -1.],
       [-2., -1., -2.],
       [-3., -3., -2.]])
于 2016-09-07T07:09:17.473 に答える