Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 所有行对上的Numpy广播元素产品?_Python_Numpy - Fatal编程技术网

Python 所有行对上的Numpy广播元素产品?

Python 所有行对上的Numpy广播元素产品?,python,numpy,Python,Numpy,我有一个形状为(n,)的一维数组a,和一个形状为(n,m)的二维数组E。我尝试执行以下计算(圆点表示元素乘法): 我已经使用for循环编写了它,但是这段代码被调用了数千次,我希望有一种方法可以通过广播或numpy函数来实现这一点。以下是我正在尝试重写的for-loop解决方案: def fun(E, A): X = E * A[:,np.newaxis] R = np.zeros(E.shape[-1]) for ii in xrange(len(E)-1):

我有一个形状为(n,)的一维数组
a
,和一个形状为(n,m)的二维数组
E
。我尝试执行以下计算(圆点表示元素乘法):

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

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)

现在,这应该是可行的:

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
并使用添加的测试用例进行测试的


希望这对你有用

感谢rikardolsson的反馈,但这似乎对我不起作用。我写了一个小测试用例,但我不确定在这里分享它的最佳方式,所以我编辑了我的原始帖子并将其放在底部。也许我应该用一个新的答案来回答,而不是编辑这个。但希望你能看到它是经过编辑的,现在可以用了。我函数的第一行(即,
X=e*A[:,np.newaxis]
)是消除
A
中的冗余标量乘法。