Numpy의 장점은 배열을 가지고 여러가지 연산을 할 수 있다는 것이다.

 

파이썬의 리스트 자료형으로 2차원 배열 이상을 다루려면 [[]] 이 괄화들이 복잡하게 쓰여진다.

 

애초에 배열적인 연산에 친화적이지는 않다. 메모리를 직접 제어하는 C언어의 문법을 생각해봐도 숫자에 초점이 맞춰진게 아니라 사용자가 컴퓨터 메모리의 작동방식을 완전히 이해하기를 원하는 방식이다.

 

물론 컴퓨터를 사랑한다면 그런 메모리의 조작 조차 신나는 일이다만 좀 더 직관적으로 데이터를 다루는데에 한계가 있다. Numpy 는 이런 마음을 알았는지 좀 더 다양하고 편리한 메서드로 배열을 처리할 수 있게 해준다.

 

데이터 분석을 잘 하고 싶다면 넘파이에 대하여 잘 다룰 필요가 있다.

 

* 이번 포스팅은 넘파이에 대한 기본 연산에 대하여 알아본다.

 

먼저 배열을 생성해보자.

 

간단한 것 부터 시작하는게 좋다.

import numpy

np_arr1 = numpy.array([1, 3, 5, 7])
np_arr2 = numpy.array([2, 4, 6, 8])
np_sum1 = numpy.concatenate([np_arr1, np_arr2])

print(np_sum1)

변수 이름은 너무 신경쓰지 않아도 된다. 프로그래밍을 하다 보면 변수 이름을 짓느라고 꽤 많은 시간을 보내게 되는데 어쩔 수 없다. 이 코드를 최소 일주일 뒤에 봤을 때 본인이 기억하는 정도가 좋다. 사람마다 이름 짓는 기준이 조금씩 다를 수 있으니까 그 정도로 이름을 짓는다. 정 자신이 없으면 주석을 쓰는 것을 추천한다. 자신만 본다면 상관이 없겠지만 소스코드를 남에게 전달하여 커뮤니케이션이 필요하다면 최소한 주석은 달아야 한다.

 

numpy.array([1, 3, 5, 7])을 보면 어떻게 생성하는지 알 수 있다. 인수를 [ ] 리스트 자료형으로 전달한다.

 

넘파이 객체는 [1 3 5 7] 로 표현될 것이다. 일단은 리스트와 다르다는 것을 파악하면 된다. 항상 우리가 보는 것은 비슷해도 내부 데이터 구조가 다를 수 있다는 점에 주의한다.

 

그리고 import numpy 를 하고 numpy를 사용하는 것은 모듈에 구현된 함수를 가져다 쓰는 것이다. 클래스의 메서드를 쓰는 경우도 있고 모듈의 함수를 가져다 쓰는 경우도 있는데 객체지향에 대하여 배웠다면 클래스는 인스턴스를 생성해야 한다는 정도는 알고 있을 것이다. 인스턴스를 생성하지 않고 그대로 사용하는 것은 함수(전역)와 스태틱 메서드, 클래스 메서드이다.

 

어떤 모듈의 경우는 인스턴스를 클래스에서 생성하거나 혹은 함수를 통해서 인스턴스를 받아야 하는 경우가 있으니 그런 부분도 생각할 필요가 있다.

 

numpy.array 메서드를 호출하면 반환값으로 

 

numpy.ndarray 의 인스턴스를 반환한다. 각각의 넘파이 객체로 프로그램을 조작하는 것이다. 파이썬의 문법에서는 C++나 자바 처럼 명시적이지 않지만 때로 혼동할 수 있으니 주의할 필요가 있다.

 

concatenate 로 두 넘파이 객체를 합쳤다. 합친다고 기존의 데이터가 변경되지는 않으니 또 새로운 변수에 참조한다.

 

두 배열을 이어 붙이면 위와 같이 된다. 1x4 의 배열이 1x8 배열이 되었다.

 

* 다음은 reshape 메소드로 배열로 바꾸는 예제다.

import numpy

np_arr1 = numpy.array([1, 3, 5, 7])
np_arr2 = numpy.array([2, 4, 6, 8])

np_arr1new = np_arr1.reshape((2,2))
np_arr2new = np_arr2.reshape((2,2))

print(np_arr1new)
print(np_arr2new)

 

1x4 행렬을 2x2 행렬로 바꾸었다.

 

* reshape 를 사용해서 10x10의 정사각형을 만들어 보자.

import numpy

arr1 = numpy.arange(100)
print(arr1.reshape((10, 10)))

이런식의 배열은 유용한데 프로그래머가 데이터를 입체적인 관점에서 볼 수 있게 한다.

 

* 다음은 축을 바꿔서 합쳐본다.

import numpy

np_arr1 = numpy.array([1, 3, 5, 7, 9, 11])
np_arr2 = numpy.array([2, 4, 6, 8, 10, 12])
np_arr1 = np_arr1.reshape((3,2))
np_arr2 = np_arr2.reshape((3,2))
print(np_arr1)
print(np_arr2)

np_sum2 = numpy.concatenate([np_arr1, np_arr2], axis=0)
print(np_sum2)

 

axis 축을 0으로 놓으면 세로축으로 합친다.

 

두개의 배열을 새로축으로 연결한 것을 볼 수 있다.

 

동일 코드를 axis 축을 1로 놓으면 가로로 합친다.

 

넘파이는 배열을 상당히 자유자재로 합칠 수 있는 장점이 있다.

 

* 좀더 간결한 코드를 만들면 아래와 같이 메서드 체인을 걸 수 있다.

import numpy

array = numpy.arange(10).reshape(2, 5)
print(array)

0부터 9까지 10개의 요소를 생성하여 즉시 reshape 한다.

 

import numpy

array = numpy.arange(9).reshape(3, 3)
print(array)

이러한 배열을 손쉽게 만들 수 있다는 것이 넘파이의 장점이다. 주의할 점은 reshape 할 때 배열의 수가 맞아 떨어지지 않으면 바로 error 메시지를 볼 수 있을 것이다. 

 

사이즈가 9 (요소가 9)인 위에 reshape(4,3)을 적용하면 불가능하다.

 

4x3 행렬의 요소 개수가 9가 될 수 없으니 당연한 결과다.

 

*배열 곱셈

 

import numpy as np

arr1 = np.arange(9).reshape(3,3)
arr2 = np.arange(9).reshape(3,3)
arr3 = arr1 * arr2

print(arr1)
print(arr2)
print(arr3)

배열간에 연산을 한다. 3x3 배열 2개를 곱하였더니 같은 행과 열의 요소간의 곱셈이 된다.

 

*배열 덧셈

덧셈도 마찬가지이다. 같은 행과 열의 요소간에 더해서 새로운 배열을 만든다. 

import numpy as np

arr1 = np.arange(9).reshape(3,3)
arr2 = np.arange(9).reshape(3,3)
arr3 = arr1 + arr2

print(arr1)
print(arr2)
print(arr3)

 

* 마지막으로 10x10을 잘라보자.

 

먼저  10x3 과 10x7로 잘라본다. 세로로 자르는 모습이다. axis = 1 이다.

import numpy

array = numpy.arange(100).reshape(10, 10)
print(array)

arr1, arr2 = numpy.split(array, [3], axis=1)
print(arr1)
print(arr2)

0, 1, 2 를 기점으로 [3] 종대로 두개의 배열로 갈랐다.

 

* axis=0 으로 놓으면 횡으로 가른다. 확인할 수 있는 것은 [ ] 사각 괄호가 하나 더 있어서 두 배열을 나누는 것을 볼 수 있다.

 

 

 

 

여기까지 배열의 기본적인 연산에 대하여 알아봤다.

 

아래의 Numpy 공식 웹사이트에 더 많은 정보가 있으니 필요한 경우 참고한다.

 

워낙 많이 쓰는 모듈이니까 인터넷에 좋은 자료들이 많이 있다. 시중에 교재는 별로 없는 것으로 아는데 구글로 검색하는 것이 도움이 된다.

 

numpy.org/doc/stable/

 

Overview — NumPy v1.19 Manual

NumPy v1.19 Manual Welcome! This is the documentation for NumPy 1.19.0, last updated Jun 29, 2020. For users: Setting Up Learn about what NumPy is and how to install it Quickstart Tutorial Aimed at domain experts or people migrating to NumPy Absolute Begin

numpy.org

 

digiconfactory.tistory.com/307

 

파이썬 | Numpy 기초 1 | Numpy 객체 생성하기 | 리스트에서 변환

opencv 를 사용하다보면 넘파이를 사용해야 한다. 이미지 파일을 넘파이 객체로 만들어 주기 때문에 넘파이을 사용해야 한다. 파이썬의 기본 자료형에 리스트가 있긴 하지만 이런 이미지나 그래

digiconfactory.tistory.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band