8

私は 2 つの配列を持っており、たとえば 2 次元の 場合などA,B、最後の次元で外積を取りたいと考えてい ます。result[:,i,j]=A[:,i]*B[:,j]A,B

2 次元になるか 3 次元になるか分からない場合はどうすればよいですか?

私の特定の問題A,Bでは、より大きな 3 次元配列からのスライスがあります。Zこれは整数インデックスで呼び出されることもあればA=Z[:,1,:], B=Z[:,2,:]、スライスで呼び出されることもありますA=Z[:,1:3,:],B=Z[:,4:6,:]。scipy はシングルトン次元を「圧迫」するため、入力がどの次元になるかわかりません。

私が定義しようとしている配列外積は、

array_outer_product( Y[a,b,:], Z[i,j,:] ) == scipy.outer( Y[a,b,:], Z[i,j,:] )
array_outer_product( Y[a:a+N,b,:], Z[i:i+N,j,:])[n,:,:] == scipy.outer( Y[a+n,b,:], Z[i+n,j,:] ) 
array_outer_product( Y[a:a+N,b:b+M,:], Z[i:i+N, j:j+M,:] )[n,m,:,:]==scipy.outer( Y[a+n,b+m,:] , Z[i+n,j+m,:] )

ランク 3 の配列Y,Zと整数の場合a,b,...i,j,k...n,N,...

私が扱っている種類の問題には、各グリッド ポイントにベクトル値関数がある 2 次元空間グリッドが含まれます。最初の 2 つの軸のスライスで定義された領域で、これらのベクトルの共分散行列 (外積) を計算できるようにしたいと考えています。

4

3 に答える 3

3

あなたは einsum で運が良いかもしれません:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.einsum.html

于 2012-07-24T12:29:58.570 に答える
2

numpy/scipy 配列での省略記号の使用を発見した後、再帰関数として実装することになりました。

def array_outer_product(A, B, result=None):
    ''' Compute the outer-product in the final two dimensions of the given arrays.
    If the result array is provided, the results are written into it.
    '''
    assert(A.shape[:-1] == B.shape[:-1])
    if result is None:
        result=scipy.zeros(A.shape+B.shape[-1:], dtype=A.dtype)
    if A.ndim==1:
        result[:,:]=scipy.outer(A, B)
    else:
        for idx in xrange(A.shape[0]):
            array_outer_product(A[idx,...], B[idx,...], result[idx,...])
    return result
于 2012-08-01T17:13:14.620 に答える
0

私があなたを正しく理解していると仮定すると、数週間前の調査で同様の問題に遭遇しました。クロネッカー積は単に次元を保存する外積にすぎないことに気づきました。したがって、次のようなことができます。

import numpy as np

# Generate some data
a = np.random.random((3,2,4))
b = np.random.random((2,5))

# Now compute the Kronecker delta function
c = np.kron(a,b)

# Check the shape
np.prod(c.shape) == np.prod(a.shape)*np.prod(b.shape)

最後にどのような形状が必要かはわかりませんが、配列スライスをnp.rollaxisnp.reshapenp.ravel(など) と組み合わせて使用​​して、必要に応じてシャッフルすることができます。これの欠点は、余分な計算を行うことだと思います。これは、制限に応じて、問題になる場合と問題にならない場合があります。

于 2012-07-24T13:56:53.977 に答える