在所有成对的行上都播出单数的乘积?

时间:2019-03-16 18:33:00

标签: python numpy

我有一个形状为(n,)的1d ndarray A和一个形状为(n,m)的2d ndarray E。我正在尝试执行以下计算(圆点表示元素明智的乘法):

enter image description here

我已经使用for循环编写了该代码,但是这段代码被调用了数千次,我希望有一种方法可以通过广播或numpy函数来实现。以下是我要重写的for循环解决方案:

def fun(E, A):
    X = E * A[:,np.newaxis]
    R = np.zeros(E.shape[-1])
    for ii in xrange(len(E)-1):
        for jj in xrange(ii+1, len(E)):
            R += X[ii] * X[jj]
    return R

任何帮助将不胜感激。

当前方法,但仍不起作用:

def fun1(E, A):
    X = E * A[:,np.newaxis]
    R = np.zeros(E.shape[-1])
    for ii in xrange(len(E)-1):
        for jj in xrange(ii+1, len(E)):
            R += X[ii] * X[jj]
    return R

def fun2(E, A):
    n = E.shape[0]
    m = E.shape[1]

    A_ = np.triu(A[1:] * A[:-1].reshape(-1,1))
    E_ = E[1:] * E[:-1] 
    R = np.sum((A_.reshape(n-1, 1, n-1) * E_.T).transpose(0,2,1).reshape(n-1*n-1,m), axis=0)

    return R

A = np.arange(4,9)
E = np.arange(20).reshape((5,4))

print fun1(E,A)
print fun2(E,A)

1 个答案:

答案 0 :(得分:2)

现在,这应该可以工作:

def fun3(E,A):
    n,m = E.shape
    n_ = n - 1

    X = E * A[:, np.newaxis]
    a = (X[:-1].reshape(n_, 1, m) * X[1:])
    b = np.tril(np.ones((m, n_, n_))).T
    R = np.sum((a*b).reshape(n_*n_, m), axis=0)

    return R

最后一个函数仅基于给定的公式。相反,它基于fun并使用添加的测试用例进行了测试。

希望这对您有用!