공부/likelion

3. making ndarray

세안_ 2021. 9. 28. 05:12

해당 포스팅에서는 numpy의 주요 메소드와 벡터와 텐서의 의미를 서술하고자 한다.

 

우선 numpy의 메소드 갯수를 dir로 확인해보면

import numpy as np

for i in dir(np):
    print(i)
len(dir(np))

그만 알아보자

3.1 np.array


전 포스팅에도 다루었지만 파이썬의 List를 대체하는 역할을 한다.
때문에 이런저런 것들을 전부 ndarray로 바꿔줄 수 있다.

a = 3
b = 3.14
c = [1,2,3]

np_a = np.array(a)
np_b = np.array(b)
np_c = np.array(c)

print(a,b,c)
print(np_a,np_b,np_c)

print(type(a),type(b),type(c))
print(type(np_a),type(np_b),type(np_c))

 

 

물론, 계산도 잘 된다.

a = 3
b = 3.14
c = [1,2,3]
d = [5]

np_a = np.array(a)
np_b = np.array(b)
np_c = np.array(c)
np_d = np.array(d)

print(np_a+np_b)
print(np_b+np_c)
print(np_c+np_d)
print(np_b+np_d)

 

앞으로는 이 ndarray에 대한 내용들이 주된 내용을 차지할 것이다.

그렇다면 이 ndarray는 무엇을 표현하고자 하는가? 

지난 포스팅에서 ndarray는 다차원 배열 공간을 표현하기 위한 자료구조라고 언급했었다. 

그렇다면 이러한 다차원 배열 공간을 지칭하는 단어는 무엇일까?

그것은 텐서와 벡터, 스칼라이다.

이것들을 내 지식의 수준에서 설명해보자면 

1. 자연 공간에서의 특정한 방향이 있는(기저의 선택) 벡터는 모두 텐서이다.
2. 벡터 공간은 원소를 서로 더하거나 주어진 배수로 늘이거나 줄릴 수 있는 개념적인 공간이다
3. 벡터는 벡터 공간 내에 존재하는 원소로, 크기와 방향을 모두 포함한다. (2~3차원 정도로 설명한다)
4. 스칼라는 크기만 존재하는 상수의 존재이며, 실수부이다.

로 정리할 수 있겠다. 

저 개념들은 서로 영향을 주고 받지만, 특히 텐서의 경우 특정 벡터의 집합이라고 보는 것이 더 옳을 듯하다.
이는 기저 벡터가 존재해야지만 이를 텐서라고 지칭할 수 있기 때문이다.
단, 실제로 우리가 다루는 데이터들은 기저 벡터가 무조건 존재한다고 볼 수 있지 않을까?

 

텐서 - 위키백과, 우리 모두의 백과사전

선형대수학에서, 다중선형사상(multilinear map)또는 텐서(tensor)는 선형 관계를 나타내는 다중선형대수학의 대상이다. 19세기에 카를 프리드리히 가우스가 곡면에 대한 미분 기하학을 만들면서 도입

ko.wikipedia.org

 

 

유클리드 벡터 - 위키백과, 우리 모두의 백과사전

2차원 벡터(u,v)의 예 수학, 물리학, 공학에서, 유클리드 벡터 또는 벡터(영어: Euclidean vector)는 벡터의 특수한 경우로, 유클리드 공간에서 크기와 방향을 모두 포함하는 기하학적 대상이다. 주로

ko.wikipedia.org

 

벡터 공간 - 위키백과, 우리 모두의 백과사전

다른 뜻에 대해서는 벡터 문서를 참고하십시오. 선형대수학에서, 벡터 공간(vector空間, 영어: vector space, 문화어: 벡토르공간, 선형공간[1][2]) 또는 선형 공간(線型空間, 영어: linear space)은 원소를

ko.wikipedia.org

 

스칼라 (수학) - 위키백과, 우리 모두의 백과사전

스칼라(scalar)는 선형대수학에서 선형공간을 정의 할 때, 선형공간의 원소와 스칼라 곱을 하는 체의 원소이다. 예를 들어, 1차 실수 계수 다항식들의 선형공간 { a + b x | a , b ∈ R } {\displaystyle \{a+bx

ko.wikipedia.org

 

3. 2 각종 메소드들

#특정 형태를 적어줘야하는 메소드
numpy.zeros(shape = (3,3 )) 
numpy.ones(shape = (4,3 )) 
numpy.empty(shape = (5,3 ))

#특정 형태와 값을 둘 다 적어줘야하는 메소드
numpy.full(shape = (2,2 ), fill_value = 5)

zeros, ones, empty는 이름에서 알 수 있듯이, 각각 0, 1, 비어있는 ndarray를 만들어준다.
하지만 이중에서도 full 같은 경우에는 특정 값으로 가득 찬 array를 만들어주기 때문에,
앞서 언급한 3가지 메소드와는 다르게 '특정 값'까지 같이 입력을 해줘야 한다.

각각의 메소드들을 이미지처리에서 쓰이는 순간들을 배웠는데, 기억나면 추가로 기입해야겠다.

K = np.array([1,2,3,4])

#형태 = shape만 따라하는 메소드들
numpy.zeros_like(K)
numpy.ones_like(K)
numpy.full_like(K, fill_value=5)
numpy.empty_like(K)

이름에서 알 수 있듯이, 이들은 기존에 선언된 특정 배열을 입력해주면 해당 배열의 크기를 따라간다.
처리하고자 하는 배열과 똑같은 크기의 배열을 선언해서 값을 처리할 때 쓰면 좋을 것 같다. 

#배열을 선언하는 메소드들
numpy.arange()

numpy.linspace()

arange의 경우 List의 range와 같다고 생각하면 되겠다.
linspace의 경우 arange에서 3번째 파라미터가 interval,  즉, 간격의 크기인 것과는 다르게 간격의 갯수를 의미한다. 

#정규분포, 또는 가우스 분포라고도 불림
numpy.random.normal() #가우시안 정규분포
numpy.random.randn() #가우시안 정규분포 값을 반환

#모든 확률변수에 대해 균일한 확률 
numpy.random.uniform() #균등분포
numpy.random.rand()#균등분포 값을 리턴

numpy.random.randint(start,end,size = ) #최소, 최대값에서 임의의 정수 반환

random은 numpy의 하단에 소속되어있지만 워낙 그 종류가 많아서 세부 항목이 따로 생겼다. 
이 중 중요한 것은 가우시안 정규분포라고 할 수 있는데,
어찌보면 분석을 하면서 각각의 칼럼(데이터들)이 가장 지향해야할 형태이자,
가장 이상적인 형태를 제공해주고 있기 때문이다.