달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

__init__.py 파일은 해당 디렉터리, __init__.py 파일이 포함되어 있는 폴더가 패키지의 일부임을 알려주는 역할을 한다.

패키지에 포함되어 있는(하부 디렉터리) 폴더에 __init__.py가 없다면 패키지로 인식되지 않는다.

 

__init__.py

  • 해당 디렉터리가 패키지의 일부임을 알려주는 역할
  • 디렉터리내에 __init__.py가 없다면 패키지로인식하지 않음
  • __init__.py 파일 안에는 해당 디렉터리에서 공통으로 적용 가능한 기능이나 모듈을 포함할 수 있다.

 

__all__

패키지 안에서 'import *' 로 사용하고 싶다면 __init__.py 파일 안의 __all__ 변수에 * 로 선언할 때 호출할 모듈들을 선언해줘야 한다.

선언 방법은 아래와 같다.

__all__ = ['포함될 모듈 네임', '포함될 모듈 네임', '포함된 모듈 네임', ...]

 

 

Posted by 생짜
|

스크립트 랭귀지를 사용할 때 가장 불편했던 것이 '전처리기'가 없다는 것이었다.

Python 도 전처리기가 없을 줄 알았는데 전처리기 패키지가 있다는 것을 알았다.

 

 

사용법은 간단히 아래와 같다.

 

from pypreprocessor import pypreprocessor

pypreprocessor.parse()

 

#define TEST

#ifdef TEST

#else

#endif

 

이다.

Posted by 생짜
|

1. Anoconda 다운로드 ( https://www.anaconda.com/distribution/#windows ) 페이지에 접속하여 Python을 다운로드한다.

 

2. 다운로드한 Anaconda를 아래아 같이 설치한다.

주의 : 기존에 설치한 Python이 있다면 Anaconda를 설치하면 지워질 수 있다.

 

3. Git Bash 다운로드 & 설치

Git Bash 다운로드( https://git-scm.com/downloads ) 사이트에 접속하여 윈도우 버전을 다운로드한다.

다운로드 후 설치후 Git Bask를 실행한다.

 

Git Bash를 실행 후 콘솔창에서 'Juptyer notebook'을 실행하면 아래와 같은 브라우저가 생성된다.

 

Jupter notebook을 실행 한 위치가 최상의 루트가 되기 때문에 jupter notebook에서 파일을 생성하면 jupter notebook을 실행한 폴더에 파일이 생성된다.

Posted by 생짜
|

다른 사람의 Python 코드를 보다가 if __name__ == '__main__' 이라는 코드를 본적이 있다.

직감적으로 아~~~ 여기부터 main이구나, Python은 Entry Point를 이렇게 정의하는구나라고 생각했다.

반은 맞고 반은 틀렸다. 정확히 말하면 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이다.

 

정확한 표현은 

 

if __name__ == '__main__'

     '코드'

 

이다.

이 코드의 의미는 __name__ 이라는 변수 값이  '__main__' 이라면 코드를 실행하라는 뜻이다. 

__name__ 변수의 값이 '__main__' 이면 '코드' 부터 시작하도록 하면 된다. '코드' 가 main 함수가 되는 것이다.

__name__이 변수라면 이 변수는 어디에 선언/정의되어 있는 것일까? 변수라면 어떤 값들을 가질 수 있는 것일까?

도대체 이 코드는 왜 사용하는 것일까?

 

  • __name__ 변수는 어디에 선언/정의 되어 있는 걸까?

__name__은 Python의 내장변수이다. Python 내부 어딘가에 선언/정의되어 있다는 뜻이다. 선언/정의되어 있는 정확한 위치는 Python Document를 찾아보면 된다.( 나도 모른다는 소리이다.)

 

  • 변수라면 어떤 값들을 가질 수 있는 것일까?

__name__ 은 모듈의 이름을 저장하는 변수다. import로 모듈을 가져올 때는 __name__에 모듈의 이름이 저장되고, import가 아니라 모듈을 실행 시킬때는 __name__ 안에 '__main__' 이라는 값이 저장된다.

 

  • 도대체 이 코드는 왜 사용하는 걸까?

Python은 모듈 단위로 실행되며 하나의 파일은 하나의 모듈이다. Python은 초기 탄생할 때 리눅스/유닉스에서 하나의 모듈, 파일로 실행, 사용했다. 그렇기 때문에 main함수가 없고 들여쓰기 하지 않는 모든 코드를 실행한다. 다만 함수나 클래스는 정의되었지만 호출되지 않는 이상 실행되지는 않는다. 사람사는게 어찌 생각한대로만 되던가...

Python은 OS의 단순 스크립터를 뛰어 넘어 광범히하게 여러군데서 사용하게 되었고 하나의 모듈, 파일 단위가 아니라 C/C++, Java 처럼 한 프로젝트에 여러개의 모듈, 파일을 가지게 되었다. 

여기서 문제가 생겼다. Python은 모듈단위로 실행 시킬 수 있다면서, import로 포함하는 것도 하나의 모듈이고 이 것도 import하자마자 실행 되겠네.

 

이 문제를 해결하기 위해 if __name__ == '__main__'  코드를 사용하는 것이다.

Python 각 모듈에 

 

if __name__ == '__main__'

     '코드'

 

이 코드가 있다면, 서두에서도 말했듯이 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이고 모듈을 import로 사용하면 __name__ 에 모듈명이 저장되기 때문에 if 구문에 False가 되어 import 한 모듈은 실행이 안되는 것이다. import를 모듈이 아니라 실행 모듈에서는 __name__'__main__' 이 저장되고 if 구문이 True가 되어 실행이 된다. 

 

아래 몇 가지만 기억하자

  1. __name__ 은 Python의 내장변수이다. 
  2. __name__ 변수는 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이다.
  3. import한 모듈에서는 __name__에 모듈명이 들어가고 실행시킨 모듈에서는 __name__'__main__' 이 저장된다.

 

결론을 말하자면 

  1. __name__ 내장변수는 모듈과 Entry Point를 구분하기 위해 사용한다.
  2. 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없다.
  3. 모듈이 메인 프로그램으로 사용될 때와 import한 모듈로 사용될 때를 구분하기 위한 용도이다.
  4. if __name__ == '__main__' 에서 __name__변수의 값이 '__main__' 인지 확인하는 코드는 현재 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.

 

코드짜기 귀찮아서 코드없이 글로만 설명하고 끝낸다. 더 정확히 말하자면 코드없이 글로 이해하기 위해 부러 코드를 짜지 않았다.

코드없이 글로만 설명했더니 장황하다...ㅎㅎㅎ

 

 

 

Posted by 생짜
|

C/C++, Java를 오랫동안 해오던 나는 Python에 main함수, Entry Point가 없는 것에 대해 궁금하게 생각했다. 아니 더 정확히 말하자면 환장하겠다.

C/C++, Java는 처음 만들어질 때부터 여러 소스파일을 사용할 수 있도록 했기 때문에 Entry Point, 시작함수인 main을 따로 정해 놓았지만 Python은 처음에 개발 될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점을따로 정하지 않았다고 한다. 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로이루어진 경우가 많은데 이 스크립트 파일이 하나의 프로그램이다 보니 시작점이 따로 필요하지 않다.

Posted by 생짜
|

브로드 캐스팅은  NumPY에서  shape가 다른 배열간에도 산술 연산이 가능하게 하는 기능이다. 

 

shape가 일치하지 않으면 다차원 배열을 할 수 없다고 했다. 이 기능은 특정 경우에만 사용할 수 있다. 모든 경우에 해당하는 것은 아니다. 큰 배열에 작은 배열을 여러번 연산하고자 할 때, 예를 들어 행렬의 각 행에 상수 벡터를 더하는 경우이다.

 

 

 

 

두 배열의 브로드캐스팅 규칙

1. 두 배열이 동일한 dimension을 가지고 있지 않다면 낮은 dimension의 1차원 배열이 높은 dimension 배열의 shpae로 간주한다.

2. 특정 차원에서 두 배열이 동일한 크기를 갖거나 두 배열 중 하나의 크기가 1이라면 그 두 배열은 특정 차원에서 compatible하다고 여겨진다

3. 두 행렬이 모든 차원에서 compatible하다면 브로드캐스팅이 가능하다.

4. 브로드캐스팅이 이뤄지면 각 배열 shape의 요소별 최소공배수로 이루어진 shape 가 두 배열의 shape로 간주한다.

5. 차원에 상관없이 크기가 1인 배열과 1보다 큰 배열이 있을 때, 크기가 1인 배열은 자신의 차원 수만큼 복사되어 샇인 것처럼 간주하다.

 

즉 다시 말해 차원이 낮은 배열을 쌓을 때 shpae가 동일하게 쌓을 수 없다면 더해지는 모양이 안나오면 브로드캐스팅이 되지 않는다.( 최소한 dimension은 동일해야 한다.)

 

브로드캐스팅을 지원하는 함수를 universal function 이라고 한다.

 

https://docs.scipy.org/doc/numpy/reference/ufuncs.html

 

Universal functions (ufunc) — NumPy v1.16 Manual

Universal functions (ufunc) A universal function (or ufunc for short) is a function that operates on ndarrays in an element-by-element fashion, supporting array broadcasting, type casting, and several other standard features. That is, a ufunc is a “vectori

docs.scipy.org

 

브로트캐스팅의 예

 

 

마지막으로 opencv-python을 이용하여 이미지 하나를 로드한 후 그 이미지의 ndarray의 shape와 ndim을 살펴보자

cv의 이미지 ndarray

 

Posted by 생짜
|

인덱싱과 슬라이싱은 NumPY에서 데이터를 다루는 중요한 부분 중에 하나이다.

 

Python의 List와 유사하게 NumPY ndarray도 슬라이싱을 할 수 있는데 다차원인 경우가 많기 때문에 각 차원별로 어떻게 슬라이스할건지 명확히 해야한다. NumPY ndarray를 슬라이싱하면 결과로 얻어지는 배열은 언제나 원본 배열의 부분 배열이다.

 

  • NumPY slicing?   

      연속된 객체 범위를 지정 선택해서 객체들을 가져오는 방법으로 슬라이싱을 하면 새로운 객체를 생성하게 된다. 원본 배열의 일부분을 복사해서 가져오지만 새로운 배열이 아니라 레퍼런스이다.

 

기본형태 : array_name[start:end:step]

각각 start, end, step은 양수와 음수를 가질 수 있다.

start: 슬라이싱을 시작할 위치로 start를 기술하지 않으면 0을 나타낸다.

end: 슬라이싱을 끝낼 위치로 end를 포함하지 않는다. 즉 end-1을 나타낸다. end를 기술하지 않으면 끝을 나타낸다.

step: stride라고도 하며 몇개씩 끊어서 가져올지를 정한다. 옵션으로 삭제할 수도 있다.

start:end:step은 ','를 이용해서 슬라이싱할 수 있다.

array_name[행 슬라이싱 시작:행 슬라이싱 끝, 열 슬라이싱 시작:열 슬라이싱 끝]

 

 

ndarray에서 인덱스 값들의 위치

양수: 연속적인 객체들의 제일 앞에서부터 0을 시작으로 함

음수: 연속적인 객체들의 제일 뒤에서부터 -1을 시작으로 함

ex_array[a,b,c,d,e]

양수의 경우 a, b, c, d, e는 순서대로 0, 1, 2, 3, 4 양수의 인덱스 값을 같고

음수의 경우 a, b, c, d, e는 순서대로 -5, -4, -3 ,-2, -1 음수의 인덱스 값을 같는다

 

원본 ndarray와 slicing된 ndarray의 관계

 

slicing된 ndarray 값 변경 후 원본 확인

 

 

행과 열 slicing의 예

 

행과 열 slicing의 결과

 

 

  • NumPY 인덱싱

 

슬라이싱이 자르는 것이라면 인덱싱은 선택을 해서 가져오는 것이다. 인덱싱을 통해서 원소에 접근할 수 있다.

인덱싱은 아래 두 가지 방법으로 접근할 수 있다.

 

  • a[0,0] //python에서 선호하는 방법, python에서는 이 방법을 사용하자.
  • a[0][0] //C++ style

 

ndarray를 인덱싱하면 연속하지 않은 값을 가져올 수 있기 때문에 원본과 다른 배열을 만들 수 있다.

 

인덱싱 예

 

인덱싱 결과

 

  • 인덱싱과 슬라이싱의 차원

 

인덱싱과 슬라이싱을 혼합해서 사용하면 낮은 차원의 배열이 생성된다.

슬라이싱은 원본의 데이타를 그대로 가져오는 레퍼러스이기 때문에 원본과 동일한 차원의 배열이 생성된다.

인덱싱은 원본에서 새로운 배열을 가져오는 것이기 때문에 원본보다 낮은 차원의 배열이 생성될 수 있다.

인덱싱을 하면은 해당 인덱싱 값만 가져오기 때문이다. 다차원 배열의 연산을 할 때는 차원이 같아야 한다. 

다차원 배열에서는 차원이 달라 연산 시 문제가 될 때가 있다. 특별히 인덱싱을 써야하는 상황이 아니라면 슬라이싱으 추천한다.

 

인덱스와 슬라이싱의 차원

 

결과

 

  • 불리언 배열 인덱싱

 

불리언 배열 인덱싱을 통해 배열 속 요소를 취사선택할 수 있다. 불리언 배열 인덱싱은 특정 조건을 만족하게 하는 요소만 선택하고자 할 때 자주 사용된다.

불리언 인덱싱

 

불리언 인덱싱

 

불리언 인덱싱은 다차원 배열에서 데이터를 필터링 할 때 많이 쓴다. 특정 조건을 만족하는 요소를 선택하고자 할 때 사용한다.

 

 

  • 정수 배열 인덱싱

정수 배열 인덱싱

 

정수 배열 인덱싱 결과

 

 

  • 전치(transpose)

전치는 모양(stride)을 바꾸는 기능을 한다. 종종 배열의 모양을 바꾸어 데이터를 처리할 때가 있다. 가장 간단한 예는 행렬의 주 대각선을 기준으로 대칭되는 요소끼리 뒤바뀌는 것이다.

행렬을 전치하기 위해서는 간단하게 배열 객체의 'T' 속성을 사용하면 된다. 1차원일 경우 대각선이 없기 때문에 전치를 해도 아무런 변화가 없다.

데이터 분석할 때 많이 사용하지는 않지만 머신러닝의 알고리즘을 구현할 때는 많이 사용한다.

 

전치

 

전치 결과

 

 

  • Shape변경

 

shape 변경에는 크게 세가지 메서드를 볼 것이다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html?highlight=reshape

resahape 메서드는 다차원 배열 데이타의 값 변화 없이 shape의 형태만 바꾸는 메서드이다.

 

numpy.reshape — NumPy v1.16 Manual

Parameters: a : array_like Array to be reshaped. newshape : int or tuple of ints The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the

docs.scipy.org

 

reshape

 

reshape 결과

 

 

ravel을 다차원 배열을 직선,  1차원으로 만들어 주는 것이다. ravel은 몰라도 resahpe를 할 줄 알면 된다. 편한 점은 사이즈를 명시하지 않아도 된다는 것이다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html?highlight=ravel

 

numpy.ravel — NumPy v1.16 Manual

Parameters: a : array_like Input array. The elements in a are read in the order specified by order, and packed as a 1-D array. order : {‘C’,’F’, ‘A’, ‘K’}, optional The elements of a are read using this index order. ‘C’ means to index the elements in row-m

docs.scipy.org

 

주로 NN학습을 할 때 사용한다. 3차워을 NN에 바로 넣어주지 않고 1차원으로 만들어서 넣어준다.

 

 

flatten은 NumPY의 모듈 함수가 아니기 때문에 np.flatten으로 사용할 수 없다. ndarray 객체의 메서드로만 사용할 수있다. reval과 동일한 결과를 나타낸다. 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html?highlight=flatten

 

numpy.ndarray.flatten — NumPy v1.16 Manual

Parameters: order : {‘C’, ‘F’, ‘A’, ‘K’}, optional ‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if a is Fortran contiguous in memory, row-major or

docs.scipy.org

 

  • ravel()과 flatten()의 차이점

flatten은 객체의 메서드로만 사용가능

ravel은 뷰(참조)를 반환, flatten은 복사본을 반환

 

 

 

  • 연결(numpy.concatenate)

https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html?highlight=concatenate

 

numpy.concatenate — NumPy v1.16 Manual

Parameters: a1, a2, … : sequence of array_like The arrays must have the same shape, except in the dimension corresponding to axis (the first, by default). axis : int, optional The axis along which the arrays will be joined. If axis is None, arrays are flat

docs.scipy.org

 

 

다차원 배열 연산

기본적인 수학함수는 배열의 각 요소별로 동작하며 연산자를 통해 동작하거나 numpy함수 모듈을 통해 동작한다.

다차원 배열간 연산 시 shape가 맞아야 연산이 이루어진다.

- 요소별 합, 차, 곱, 나눗셈의 경우 shape가 일치해야 함

- dot의 경우 앞 배열의 열과 뒤 배열의 행의 크기가 일치해야 함

다차원 배열의 연산

 

다차원 배열의 연산 결과

 

NumPY에서는 벡터의 내적, 베터와 행렬의 곱, 행렬곱을 위해 *대신 dot 함수들을 사용한다. dot은 NumPY 모듈 함수또는 배열 객체의 메소드로서도 이용 가능한 함수이다.

dot함수는 인자값에 따라 명칭도 달라진다.

 

Posted by 생짜
|

ndarray의 축 설명

 

ndarray의 통계값을 구할 때는 전체에서 구할 수도 있지만 행/열 등 축을 기준으로 구할 수도 있다.

 

  • NumPY amin - 최소값 구하기

https://docs.scipy.org/doc/numpy/reference/generated/numpy.amin.html?highlight=amin

 

numpy.amin — NumPy v1.16 Manual

Parameters: a : array_like Input data. axis : None or int or tuple of ints, optional Axis or axes along which to operate. By default, flattened input is used. If this is a tuple of ints, the minimum is selected over multiple axes, instead of a single axis

docs.scipy.org

 

  • NumPY amax - 최대값 구하기

https://docs.scipy.org/doc/numpy/reference/generated/numpy.amax.html?highlight=amax

 

numpy.amax — NumPy v1.16 Manual

Parameters: a : array_like Input data. axis : None or int or tuple of ints, optional Axis or axes along which to operate. By default, flattened input is used. If this is a tuple of ints, the maximum is selected over multiple axes, instead of a single axis

docs.scipy.org

 

  • NumPY ptp - 최대, 최소의 범위 값을 구한다.

ndarray의 크기가 커서 전체를 다 볼 수 없을 때 해당 다차원 배열의 최대, 최소의 범위를 보는 함수이다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ptp.html?highlight=ptp#numpy.ptp

 

numpy.ptp — NumPy v1.16 Manual

Parameters: a : array_like Input values. axis : None or int or tuple of ints, optional Axis along which to find the peaks. By default, flatten the array. axis may be negative, in which case it counts from the last to the first axis. If this is a tuple of i

docs.scipy.org

 

  • NumPY median

https://docs.scipy.org/doc/numpy/reference/generated/numpy.median.html?highlight=median

 

numpy.median — NumPy v1.16 Manual

Parameters: a : array_like Input array or object that can be converted to an array. axis : {int, sequence of int, None}, optional Axis or axes along which the medians are computed. The default is to compute the median along a flattened version of the array

docs.scipy.org

 

  • NumPY mean

산술평균을 구할 때 쓴다. 가중평균을 구할 때는 average 메서드를 사용한다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html#numpy.mean

 

numpy.mean — NumPy v1.16 Manual

Parameters: a : array_like Array containing numbers whose mean is desired. If a is not an array, a conversion is attempted. axis : None or int or tuple of ints, optional Axis or axes along which the means are computed. The default is to compute the mean of

docs.scipy.org

 

  • NumPY var - 분산

https://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html?highlight=var

 

numpy.var — NumPy v1.16 Manual

Parameters: a : array_like Array containing numbers whose variance is desired. If a is not an array, a conversion is attempted. axis : None or int or tuple of ints, optional Axis or axes along which the variance is computed. The default is to compute the v

docs.scipy.org

 

  • NumPY std - 표준편차

https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html?highlight=std

 

numpy.std — NumPy v1.16 Manual

Parameters: a : array_like Calculate the standard deviation of these values. axis : None or int or tuple of ints, optional Axis or axes along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array.

docs.scipy.org

 

Posted by 생짜
|

다차원 배열의 자료형

NumPY의 다차원배열의 원소는 동일한 데이터 타입을 가져야 한다. 다양한 자료형을 하나의 배열에 표현하고 싶을 경우 Pandas의 데이타프레임을 이용하면 된다.

 

직접 값을 입력해 다차원 배열을 만드는 방법

  • np.array() 메서드를 이용

 

bool형 ndarray 만들기

bool형 ndarray 생성

 

결과

 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html?highlight=array#numpy.array

 

numpy.array — NumPy v1.16 Manual

Parameters: object : array_like An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence. dtype : data-type, optional The desired data-type for the array. If not given, then the type wil

docs.scipy.org

https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html?highlight=dtype#numpy.dtype

 

numpy.dtype — NumPy v1.16 Manual

Attributes: alignment The required alignment (bytes) of this data-type according to the compiler. More information is available in the C-API section of the manual. base byteorder A character indicating the byte-order of this data-type object. One of: ‘=’ n

docs.scipy.org

 

 

정수형 ndarray 만들기

정수형 다차원배열은 정수형, 부호없는 정수형, 실수형, 복소수형이 있다. 정수형의 default data type는 'int64' 이다.

  • 정수형

 

  • 부호없는 정수형

 

  • 실수형

 

  • 복소수형

 

  • python list에서

 

  • 3차원 ndarray 만들기

 

 

파일에서 데이터를 입력 받아 다차원 배열 생성하기

np.genfromtxt()을 이용하여 파일에 저장된 데이터를 입력받아 다차원 배열을 생성할 수 있다.

  • ndarray는 동일한 자료형만 가질 수 있다.( C의 배열이기 때문에 )
  • 파일에는 정수, 실수, 문자열이 섞여 있기 때문에 사용상 어려움이 있다.
  • 파일에서 데이터를 읽어올 때는 genfromtxt보다는 Pandas의 read_csv(), read_excel()을 주로 사용한다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

 

numpy.genfromtxt — NumPy v1.16 Manual

Parameters: fname : file, str, pathlib.Path, list of str, generator File, filename, list, or generator to read. If the filename extension is gz or bz2, the file is first decompressed. Note that generators must return byte strings in Python 3k. The strings

docs.scipy.org

 

 

 

NumPY의 메서드를 이용해 다차원 배열을 만드는 방법

NumPY의 array 함수를 이용해서 다차원 배열을 만들었다. 이제 array가 아닌 다른 메서드를 이용해서  다차원 배열을 만드는 방법을 알아보자

 

https://docs.scipy.org/doc/numpy/reference/routines.array-creation.html

 

Array creation routines — NumPy v1.16 Manual

Note numpy.char is the preferred alias for numpy.core.defchararray.

docs.scipy.org

 

다차원 Array를 만드는 다른 방법들.

 

 

 

 

 

 

 

 

 

10 * np.ones((2,2))

 

 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html#numpy.linspace

 

numpy.linspace — NumPy v1.16 Manual

Parameters: start : array_like The starting value of the sequence. stop : array_like The end value of the sequence, unless endpoint is set to False. In that case, the sequence consists of all but the last of num + 1 evenly spaced samples, so that stop is e

docs.scipy.org

 

Posted by 생짜
|

1. NumPY ?

karma( 업 )/Python 2019. 5. 5. 09:11

NumPY는 벡터 행렬계산을 효율적으로 처리하기 위한 모듈로 Numeric 모듈과 Numarray 모듈이 합쳐져 높은 수준의 다차원 배열 계산을 고속 및 효율적으로 처리할 수 있다. 역시 pip 로 설치할 수 있다. pip로 opencv-python을 설치할 때 numpy는 자동으로 설치가 되는데 영상을 다룰때 numpy는 꼭 필요한 lib이기 때문이다.

하지만 NumPY만으로는 무언가를 할 수는 없다. NumPY는 데이타를 가공하는 도구일 뿐이기 때문이다. NumPY를 통해 1차적으로 가공된 다차원배열의 데이타( 영상같은 )를 가지고 opencv 같이 필요한 모듈에서 사용하는 것이다.

 

NumPY, Scipy, Matplotlib와 opencv-python에 대해 정리를 할 것이다.  따로 Python 문법에 대해서는 언급하지 않을 것이다. python 문법은 간단하기 때문에 필요 모듈을 공부하다 보면 자연스럽게 익혀지게 될 것이다.

아래 사이트는 Python의 자료형 및 NumPy 및 영상처리를 위한 Scipy와 Matplotlib에 대한 내용이 있다.

 

Python, Numpy, Scipy, Matplotlib Tutorial

 

Python Numpy Tutorial

이 튜토리얼은 Justin Johnson 에 의해 작성되었습니다. cs231n 수업의 모든 과제에서는 프로그래밍 언어로 파이썬을 사용할 것입니다. 파이썬은 그 자체만으로도 훌륭한 범용 프로그래밍 언어이지만, 몇몇 라이브러리(numpy, scipy, matplotlib)의 도움으로 계산과학 분야에서 강력한 개발 환경을 갖추게 됩니다. 많은 분들이 파이썬과 numpy를 경험 해보셨을 거라고 생각합니다. 경험하지 못했을지라도 이 문서를 통해 ‘프로그래밍 언어로

aikorea.org

 

 NumPY는  파이썬이 계산과학분야에 이용될때 핵심 역할을 하는 라이브러리이다.

 

1. NumPY?

2. 다차원 배열 생성하기

3. 메서드를 이용해서 최대, 최소, 평균, 표준편차 등 통계값 구하기

4. 인덱싱, 슬라이싱, 전치, 형태변경, 연결, 연산을 이용한 다차원 배열 현태 변경하기

5. 브로드캐스팅, 벡터화 연산 NumPY 고급기능

 

순서대로 공부를 진행할 예정이다.

 

첫 번째로 '1. NumPY 개요'에 대해서 공부를 해보자. 

 

NumPY는 거의 모든 Python lib 모듈을 사용하는데 있어 기본이 된다.

NumPy 존재이유

 

NumPY는 Pandas, Scikit-learn, Tensorflow등 데이터 사이언스 분야에서 사용되는 라이브러리들의 토대가 되는 라이브러리이다. NumPY 는 높은 수준의 데이터 분석 기능을 제공하지 않지만 NumPY를 활용해 Python상에서 표현하고 다룰 줄 알아야만 데이터 분석이라는 그 이후 단계로 나아갈 수 있다. NumPY만으로는 머신러닝을 할 수 없다. NumPY는 다차원 배열이라는 ndarray를 데이타로 나나태는 특화된 라이브러리이다. NumPY를 사용해서 데이타를 분석하거나 머신러닝 코드를 짜는게 목적이기 때문에 라이브러리로써 사용할 줄 알게 되면 된다. 다시 말해 NumPY는 다차원 배열을 나타내기 위한 라이브러리이다. 

Python에는 list라는 컨테이너가 있다. 이 list안에 list를 중첩시킴으로써 다차원 배열을 나타낼 수 있다. Python의 list와 NumPY는 무엇이 다를까? Python의 list에 접근하기 위해서는 for문을 사용하고 1차원에서 2차원으로 데이터의 차원이 증가하면 반복문도 중첩되게 사용하게 되어 데이터의 차원이 증가할수록 코드는 복잡해질 수밖에 없다. NumPY를 사용하면 다차원배열을 효율적으로 다룰 수 있고 C로 구현되어 있는 NumPY보다 Python의 list가 느리다. 

 

NumPY 사용 예

 

결과 값

 

NumPY 장점

  • 코어부분이 C로 구현되어 동일한 연산을 하더라도 Python에 비해 속도가 빠르다.
  • 라이브러리에 구현되어있는 함수들을 활용해 짧고 간결한 코드 작성이 가능하다.
  • 효율적인 메모리 사용이 가능하도록 구현되어 있다. 

 

NumPY는 다차원 배열을 내부에 구현되어 있는 메소들을 사용하여 편리하게 사용, 나타낼 수 있으며 빠르기 때문에 많이 사용된다. 

 

ndarray가 list보다 빠른 이유

ndarrary vs list 구조

 

그림에서 보면 Python list에는 데이터가 들어있지 않고 데이터를 가르키는 포인터, 주소값이 들어가 있다. NumPY이는 C 배열처럼 연속적으로 데이터가 그대로 입력되어 있어 구조상으로 차이가 난다. NumPY는 이 데이터를 C 반복문으로 순회하고 Python은 Python 반복문으로 순회하기 때문에 구조적으로 언어적으로 속도의 차이가 발생한다. 

 

Python list가 느린 이유

  • Python list는 결국 포인터의 배열
  • 경우에 따라 각각 객체가 메모리 여기저기 흩어져 있어 캐시 활용이 어렵다.

 

NumPY ndarray가 빠른 이유

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

 

 

 

 

 

Posted by 생짜
|