我有一个形状为(n,)的1d ndarray A
和一个形状为(n,m)的2d ndarray E
。我正在尝试执行以下计算(圆点表示元素明智的乘法):
我已经使用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)
答案 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
并使用添加的测试用例进行了测试。
希望这对您有用!