Я пытаюсь вычислить перекрестные произведения многих векторных пар 3x1 как можно быстрее. Этоcross products with einsums
n = 10000
a = np.random.rand(n, 3)
b = np.random.rand(n, 3)
numpy.cross(a, b)
дает правильный ответ, но мотивировано this answer to a similar question, я думал, что einsum
поймают меня куда-то. Я обнаружил, что оба
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
:
%timeit np.cross(a, b)
1000 loops, best of 3: 628 µs per loop
%timeit np.einsum('ijk,aj,ak->ai', eijk, a, b)
100 loops, best of 3: 9.02 ms per loop
%timeit np.einsum('iak,ak->ai', np.einsum('ijk,aj->iak', eijk, a), b)
100 loops, best of 3: 10.6 ms per loop
Любой идеи о том, как улучшить einsum
s?
И поскольку они не связаны с циклами, улучшение 'cython' может быть незначительным. Когда выражается так, что «крест» является скорее алгебраической операцией, чем массивной. – hpaulj