你可以用
np.einsum
-
v = data[idx]
summed = np.einsum('ijk,ij->ik', v, mask)
在给定样本上运行-
In [43]: v = data[idx]
In [44]: np.einsum('ijk,ij->ik', v, mask)
Out[44]:
array([[1, 1, 1, 0, 0, 0],
[0, 2, 0, 0, 0, 0]])
或者,使用
np.matmul
-
In [67]: np.matmul(v.swapaxes(1,2), mask[...,None])[...,0]
Out[67]:
array([[1, 1, 1, 0, 0, 0],
[0, 2, 0, 0, 0, 0]])
# Put another way
In [80]: np.matmul(mask[:,None,:], v)[:,0]
Out[80]:
array([[1, 1, 1, 0, 0, 0],
[0, 2, 0, 0, 0, 0]])
保持循环并提高性能
如果循环不够,并且每次迭代都有足够的求和减少,那么可以用矩阵乘法代替迭代操作。因此-
for i in xrange(idx.shape[0]):
summed[i] = mask[i].dot(data[idx[i]])