我試圖儘可能快地計算多個3x1向量對的交叉積。這與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
任何如何改進0123的想法s?
而且由於這些不涉及循環,所以'cython'的改進可能並不重要。當這樣表達時,「交叉」比陣列更像是一種代數運算。 – hpaulj