가능한 한 빨리 많은 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)
는 외적을 계산하는 것을 발견,하지만 성능은 실망 :
%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
하나 : 두 가지 방법이 훨씬 더 np.cross
보다 수행 0123을 향상시키는 방법에 대한 아이디어s?
그리고 이것들은 루프를 포함하지 않기 때문에'cython' 개선이 중요하지 않을 수 있습니다. 이 '십자가'와 같이 표현하면 배열보다 대수 연산이 더 많이됩니다. – hpaulj