, , , , . , , <a x b, c x d> = <a, c><b, d> - <a, d><b, c>.
, -,
eijk = np.zeros((3, 3, 3))
eijk[0, 1, 2] = eijk[1, 2, 0] = eijk[2, 0, 1] = 1
eijk[0, 2, 1] = eijk[2, 1, 0] = eijk[1, 0, 2] = -1
np.einsum('ijk,aj,ak->ai', eijk, a, b)
np.einsum('iak,ak->ai', np.einsum('ijk,aj->iak', eijk, a), b)
np.cross, einsums , , .
: , np.cross ( n):

import numpy as np
import perfplot
eijk = np.zeros((3, 3, 3))
eijk[0, 1, 2] = eijk[1, 2, 0] = eijk[2, 0, 1] = 1
eijk[0, 2, 1] = eijk[2, 1, 0] = eijk[1, 0, 2] = -1
perfplot.show(
setup=lambda n: np.random.rand(2, n, 3),
n_range=[2**k for k in range(14)],
kernels=[
lambda X: np.cross(X[0], X[1]),
lambda X: np.einsum('ijk,aj,ak->ai', eijk, X[0], X[1]),
lambda X: np.einsum('iak,ak->ai', np.einsum('ijk,aj->iak', eijk, X[0]), X[1]),
],
labels=['np.cross', 'einsum', 'double einsum'],
xlabel='len(a)',
logx=True,
logy=True,
)