Вот один с NumPy -векторизацией -
mask = indices[:,None] < np.arange(len(x))
v = x[indices,None] - x
vmasked = v[mask]
log_addition = np.log(np.abs(vmasked))
out = log_addition.sum() + mask.sum()
В качестве альтернативы, используя l aws журнала, мы можем заменить последние два шага на -
out = np.log(np.prod(np.abs(vmasked))).sum() + mask.sum()
Вытолкнув abs
, чтобы он работал вместо скаляра, он будет -
out = np.log(np.abs(np.prod(vmasked))).sum() + mask.sum()
Опять же, мы можем использовать multi-cores
с numexpr
-
import numexpr as ne
out = np.log(np.abs(ne.evaluate('prod(vmasked)'))) + mask.sum()
Если вы обнаружите, что даже v
имеет слишком много нежелательных элементов, мы можем напрямую go до vmasked
с -
xi = x[indices]
x2D = np.broadcast_to(x, (len(indices),len(x)))
vmasked = np.repeat(xi,mask.sum(1))-x2D[mask]