[플레이데이터 빅데이터 부트캠프]Python list vs ndarray

list

리스트로 합과 평균을 만들 때

test = [15, 20, 25]
testTotal = sum(test)
testAvg = sum(test) / len(test)
testAvg
20.0

위와 같은 형식을 따른다.

그리고 만약 여기서 30을 추가하려면, append 메소드를 사용하면 된다.

test.append(30)

그런데 만약, 여기서 test의 요소 하나하나를 5씩 더하려고 하면 어떻게 해야 될까?

test + 5
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-184-8a025d832785> in <module>()
----> 1 test + 5

TypeError: can only concatenate list (not "int") to list

단순히 test에 +5를 더하면 오류가 난다.

ndarray

만약 넘파이 어레이라면 어떻게 될까?

test = np.array((15, 20, 25, 30))
test
array([15, 20, 25, 30])

위는 넘파이 어레이를 만드는 형식이다.

test + 5 
array([20, 25 30, 35])

하지만 어레이는 리스트와 다르게 원본 자체는 유지가 된다. 이러한 특성은 데이터 관련 패키지에 유용하게 사용된다.

test
array([15, 20, 25, 30])

또한 넘파이 어레이는 내부에서 C로 구성되어 있으므로, 연산속도가 매우 빠르다는 장점이 있다.

이처럼 넘파이 어레이는 배열이나 행렬 계산에 용이하게 쓰이고, 인공 신경망, 비정형 데이터 처리에서도 요긴하게 쓰이고 있다.

ndarray 와 list 자료 저장 구조

파이썬 list

  • 파이썬 리스트는 포인터의 배열로 객체가 메모리 여기저기 흩어져 있음
  • 객체가 메모리 여기저기 흩어져 있음
  • 그러므로 캐시 활용이 어려움

Numpy ndarray

  • ndarray는 타입을 명시하여 원소의 배열로 데이터를 유지한다.
  • 다차원 데이터도 연속된 메모리 공간이 할당됨
  • 많은 연산이 dimension가 strides를 잘 활용하면 효율적으로 가능하다.

 

그림은 리스트와 ndarray의 자료 저장 구조를 나타내고 있다.