본문 바로가기

1. Python

Python 전치연산 + 배열 연결1 (11강-13강)

 

 

11강_전치연산_ 3차원 배열


#전치행렬 : 'T'로 표기. 행렬의 행과 열이 서로 바뀌게 됨.

>>> import numpy as np


>>> x = np.array([[1,2],[3,4]])
>>> x
array([[1, 2],
       [3, 4]])
>>> tt=np.array([[1,2],[3,4]])
>>> print(tt)
[[1 2]
 [3 4]]
>>> print(tt.T) # 전치가 된 상태
[[1 3]
 [2 4]]
>>> 


#백터일 때, rank가 1인 경우에는 전치가 이루어지지 않음.
>>> vv=np.array([1,2,3])
>>> print(vv.T) #명령어를 입력해도 전치가 이루어지지 않음.
[1 2 3]


# empty명령어 : 배열만 생성하고자 할 때 사용
>>> g=np.empty((4,3))
>>> g
array([[2.12199579e-314, 0.00000000e+000, 0.00000000e+000],
       [5.42764133e-223, 6.45268351e+155, 9.88131292e-324],
       [0.00000000e+000, 0.00000000e+000, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000, 1.11253693e-308]])





# 3차원 배열 만들기
# 예) 2*3*3의 Array
# 2*3*3 = 면*행*렬 순
>>> d=np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[11,12,13,14],[15,16,17,18],[19,20,21,22]]])
>>> d
array([[[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]],

       [[11, 12, 13, 14],
        [15, 16, 17, 18],
        [19, 20, 21, 22]]])


 #3차원 배열의 면의 값을  구하는 명령어 : len()
>>> len(d)
2
#3차원 배열의 행의 값을  구하는 명령어 : len(d[0])
>>> len(d[0])
3
#3차원 배열의 열의 값을  구하는 명령어 : len(d[0][0])
>>> len(d[0][0])
4



>>> c=np.ones((2,3,4), dtype="i")
>>> c
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]], dtype=int32)


>>> k=np.ones_like(c, dtype="f") #c와 똑같은 배열을 만들고 싶을 떄
>>> k
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]], dtype=float32)

>>> cc=np.copy(c) #c와 같은 내용을 출력하고 싶을 때
>>> cc 
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]], dtype=int32)

>>> z=np.zeros((2,3,4))
>>> z
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])

>>> zz=np.zeros_like(z, dtype="f")
>>> zz
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]], dtype=float32)


>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3,5) # 시작값이 3, 끝값이 5 (끝값은 제외하고 출력)
array([3, 4])
# arange(a,b)라면 a부터 b-1까지 표기가 됨
>>> np.arange(0,10,2) # 맨 뒤의 2는 단계. 간격과 같은 개념.
array([0, 2, 4, 6, 8])

 



12강_브로드캐스팅의 이해

>>> a=np.array([1,2,3])
>>> b=np.array([1,2])
>>> a.shape #a는 3개의 요소가 있는 벡터
(3,)
>>> b.shape #b는 2개의 요소가 있는 벡터
(2,)

# 단순히 a+b의 연산을 실행할 시 에러가 발생함
# broadcast에 대한 오류인데, 확장을 할 수 없어 연산이 불가하다는 내용
# 그러나 numpy에서는 broadcasting의 기능을 지원하고 있음.
# broadcasting은 모양(shape)이 다른 배열들 간의 연산이 어떤 조건을 만족할 때 

  가능하도록 배열을 자동적으로 변환하는 것
# 기본적으로 확장의 개념으로 1*1 (10)이 2*2 (10,10,10,10)으로 변하여 연산

>>> a=np.array([[1,2],[3,4]])
>>> b=10 # 스칼라값으로 단순히 10만 넣어도 됨.
>>> a+b
array([[11, 12],
       [13, 14]])
# 자동으로 broadcasting이 되어서 연산이 됨.


>>> a=np.array([1,2,3,4])
>>> b=np.array([1,2])
# a+b의 연산을 실행할 시 에러가 발생함.
# 한 쪽이 스칼라인 경우, broadcasting연산이 가능하지만 이런 경우는 연산
이 될 수 없음.
# 결과적으로, 차원의 크기가 1인 경우에 한정하여 broadcasting이 가능
>>> x=np.arange(3) # 0,1,2가 출력
>>> y=5
>>> x+y
array([5, 6, 7])



# 3*3 + 1*3의 broadcasting의 연산이 가능.
# 1*3의 아래부분을 확장하여 3*3으로 결과가 출력이 됨.
>>> np.ones((3,3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
>>> a=np.ones((3,3))
>>> b=np.arange(3)
>>> a+b
array([[1., 2., 3.],
       [1., 2., 3.],
       [1., 2., 3.]])



# 3*1 + 1*3의 broadcasting의 연산이 가능.

# 이런 경우, 양쪽에서 broadcasting이 발생. 3*1의 값이 3*3으로, 1*3의 값이 3*3으로 확장되어 결과가 출력이 됨.
>>> x=np.arange(3).reshape((3,1)) #reshape를 이용하여 3*1로 규격을 바꾸어줌
>>> y=np.array([1,2,3])
>>> x+y
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5]])



# 3차원의 배열에서도 broadcasting이 발생할 수 있음
# 3*4*2 (3차원배열) + 4*2 (2차원배열) = 면을 확장하여 결과가 출력이 됨.

>>> array3d=np.array([[[0,1],[2,3],[4,5],[6,7]],[[8,9],[10,11],[12,13],[14,1
5]],[[16,17],[18,19],[20,21],[22,23]]])
>>> array3d #3차원 배열 생성
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])

>>> array2d=np.array([[0,1],[2,3],[4,5],[6,7]])
>>> array2d #2차원 배열 생성
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])

>>> array3d + array2d
array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10],
        [12, 14]],

       [[ 8, 10],
        [12, 14],
        [16, 18],
        [20, 22]],

       [[16, 18],
        [20, 22],
        [24, 26],
        [28, 30]]])

 


13강_배열 연결(concatenate) 1

#Numpy의 자료형을 설정하는 방법
>>> x=np.array([1,2,3])
>>> x
array([1, 2, 3])

>>> x.dtype
dtype('int32')

>>> x=np.array([1,2,3.0]) #이런 경우, 자료형이 실수형(float)으로 바뀌게 됨
>>> x.dtype
dtype('float64')

>>> x=np.array([1,2,3], dtype="int")
>>> x.dtype # 정수형(int)으로 직접 지정하여 출력도 가능
dtype('int32')


#dtype의 접두사 사용하기
# b : boolean
# u : 부호가 없는 정수 (예:u8[64비트])
# i : int(정수형) (예:i8[64비트])

# f : float(실수형. 부동소수점) (예:f8[64비트])
# c : complex(복소수 부동소수점) (예:c16[128비트])
# 0 : 객체 (예:0[객체에 대한 포인터])
# S(대문자) : 바이트 문자열 (예:S24[24글자])
# U(대문자) : 유니코드 문자 (예:U24[24개의 유니코드 글자])

>>> y=np.array([1,2,3], dtype="f")
>>> y
array([1., 2., 3.], dtype=float32)
# 파이썬을 설치할 떄 기본적으로 32비트로 설치되어 32가 출력이 됨.

>>> x=np.array([1,2,3], dtype="U")
>>> x[0]+x[1]
'12'
#숫자 1,2,3이 아닌 유니코드 1,2,3으로 출력이 되어 있음.

#Inf(Infinity, 무한대), NaN(not a number), N/A(Not applicable, Not available)
>>> np.array([0,1,-1,0]) / np.array([1,0,0,0])
<stdin>:1: RuntimeWarning: divide by zero encountered in divide
<stdin>:1: RuntimeWarning: invalid value encountered in divide
array([  0.,  inf, -inf,  nan])
# 1을 0으로, -1을 0으로 나눌 수는 없어서 Inf가 출력, 0을 0으로 나눌 수 없어서 nan이 출력


#배열 연결(Concatenate) : 행의 수나 열의 수가 동일한 두 개 이상의 배열을 연결하여 더 큰 배열을 만들 때 사용하는 방법.
# hstack, vstack, dstack, stack, r_, c_, tile 등의 명령어를 사용.

# hstack : 행의 수가 같은 2개 이상의 배열을 연결
>>> a1=np.ones((2,3))
>>> a1
array([[1., 1., 1.],
       [1., 1., 1.]])
>>> a2=np.zeros((2,2))
>>> a2
array([[0., 0.],
       [0., 0.]])
>>> np.hstack([a1,a2])
array([[1., 1., 1., 0., 0.],
       [1., 1., 1., 0., 0.]])
#a1과 a2의 열을 그대로 붙여서 연결된 상태

# vstack : 열의 수가 같은 2개 이상의 배열을 연결
>>> b1=np.ones((2,3))
>>> b1
array([[1., 1., 1.],
       [1., 1., 1.]])
>>> b2=np.zeros((3,3))
>>> b2
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
>>> np.vstack([b1,b2])
array([[1., 1., 1.],
       [1., 1., 1.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
#b1과 b2의 행을 그대로 붙여서 연결된 상태