python numpy axis performance 관련 질문

조회수 1145회

안녕하세요

numpy 는 default로 row major order로 배열을 생성시켜 줍니다.

따라서 row를 따라 계산하는 것이 더 빠른것이 자연스러운데요.

numpy 에서 제공된는 sum이나 mean 같은 함수를 사용시 잘 이해가 안되는 결과가 나와서 질문드립니다.

아래 예제를 보시면

a = np.array([[1,2,3], 
              [4,5,6], 
              [7,8,9]], order='C')


print(a.sum(axis=1))
[ 6 15 24]


이 경우 a.sum(axis=1)이 row를 따라 계산하는 것입니다. 아래와 같이요.

a[0,:].sum(), a[1,:].sum(), a[2,;].sum()

반면 a.sum(axis=0)은 column을 따라 계산하는 것이기 때문에 a.sum(axis=0) 보다 계산 속도가 느려야 할 것으로 생각됩니다. 하지만 아래와 같은 테스트 상황에서는 반대 결과가 나오는데요.

a = np.random.rand(5000, 5000)

%timeit a.sum(axis=1)
29.7 ms ± 231 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit a.sum(axis=0)
16.9 ms ± 82.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

보시는 것 처럼 column을 따라 계산한 것이 더 빠릅니다.

반면에 하나의 row 나 column을 잡아서 계산하면 row를 따라 계산한것이 더 빠르게 나옵니다.

%timeit a[0,:].sum()
3.41 µs ± 4.91 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit a[:,0].sum()
38.7 µs ± 31.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

이것을 어떻게 설명할 수 있을지요?

anaconda python 3.6.3을 사용하였으며 윈도우에서 테스트한 것입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)