计算具有任意尺寸的阵列的外积

时间:2012-07-23 21:22:07

标签: python arrays numpy scipy slice

我有两个数组A,B,想要在最后一个维度上获取外部产品, 例如 result[:,i,j]=A[:,i]*B[:,j]A,B是二维时。

如果我不知道它们是2维还是3维,我怎么能这样做?

在我的具体问题中A,B是一个更大的三维数组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,:] )

适用于任何rank-3数组Y,Z和整数a,b,...i,j,k...n,N,...

我正在处理的问题涉及二维空间网格,每个网格点都有一个矢量值函数。我希望能够在前两个轴上的切片定义的区域上计算这些向量的协方差矩阵(外积)。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分: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

答案 2 :(得分:0)

假设我理解正确,几周前我在研究中遇到了类似的问题。我意识到Kronecker产品只是一种保留维度的外部产品。因此,你可以这样做:

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(等)组合使用以改变周围的事物如你所愿。我想这的缺点是它做了一些额外的计算。根据您的限制,这可能或不重要。