STUDY

[Python] Numpy(배열 생성)

moru_xz 2023. 2. 12. 15:45

Numpy

1. Numpy 특징

- Numerical Python의 약자
- 고성능 과학 계산용 패키지로 강력한 N차원 배열 객체
- 범용적 데이터 처리에 사용 가능한 다차원 컨테이너
- 정교한 브로드캐스팅(broadcasting) 기능
- 파이썬의 자료형 list와 비슷하지만, 더 빠르고 메모리를 효율적으로 관리
- 반복문 없이 데이터 배열에 대한 처리를 지원하여 빠르고 편리
- 데이터 과학 도구에 대한 생태계의 핵심을 이루고 있음

 

 2. 배열 생성

리스트로 배열 만들기

a1 = np.array([1, 2, 3, 4, 5])
print(a1)
print(type(a1))
print(a1.shape) # 5개의 element들이 있구나, 쉼표 뒤에 아무것도 없으면 1차원이라는 것
print(a1[0], a1[3])
a1[0] = 4
a1[1] = 5
a1[2] = 6 #수정도 가능
a1
[1 2 3 4 5]
<class 'numpy.ndarray'>
(5,)
1 4

array([4, 5, 6, 4, 5])
(5, )는 element들이 5개가 있고, 쉼표 뒤에 아무 것도 없으면 1차원이라는 의미 

 

a2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a2)
print(a2.shape) # 3x3
print(a2[0, 0], a2[1,2])
[[1 2 3]
 [4 5 6]
 [7 8 9]]
(3, 3)
1 6

-> 2차원

a3 = np.array([ [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
              [ [1, 2, 3], [4, 5, 6], [7, 8, 9]],
              [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] ])
              
print(a3)
print(a3.shape)
[[[1 2 3]
  [4 5 6]
  [7 8 9]]

 [[1 2 3]
  [4 5 6]
  [7 8 9]]

 [[1 2 3]
  [4 5 6]
  [7 8 9]]]
(3, 3, 3)

-> 3차원

 

배열 생성 및 초기화

  • zeros(): 모든 요소를 0으로 초기화
np.zeros(10)
>> array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
  • ones(): 모든 요소를 1로 초기화
np.ones(10)
>> array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,3))

>>
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

-> shape 모양 넣어서 2차원 형태도 가능 

  • full(): 모든 요소를 지정한 값으로 초기화
np.full((3,3),1.23)
>>
array([[1.23, 1.23, 1.23],
       [1.23, 1.23, 1.23],
       [1.23, 1.23, 1.23]])

-> 3x3에 1.23으로 채워진 배열 

  • eye(): 단위행렬(identity matrix) 생성
    • 주대각선의 원소가 모두 1이고 나머지 원소는 모두 0인 정사각인 행렬 
np.eye(3)
>>
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

-> 정사각 행렬이라 shape모양 지정하지 않고 n크기만 지정

np.eye(4)면

np.eye(4)
>>
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
  • tri(): 삼각행렬 생성
np.tri(3) #삼각 모형이 1 나머지는 0 -> 수업 때 했던!!
>>
array([[1., 0., 0.],
       [1., 1., 0.],
       [1., 1., 1.]])
  • empty(): 초기화 되지 않은 배열 생성
    • 초기화가 없어서 배열 생성비용 저렴하고 빠름
    • 초기화되지 않아서 기존 메모리 위치에 존재하는 값이 있음 
np.empty(10) #기존의 값이 들어가 있는 것 -> 어떤 값이 올지 모름
>> array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
  • _like(): 지정된 배열과 shape이 같은 행렬 생성
    • np.zeros_like()
    • np.ones_like()
    • np.full_like()
    • np.empty_like()
print(a1)
>> [4 5 6 4 5]
np.zeros_like(a1) #a1 과 같은 shape의 배열에 0을 채워줘
>> array([0, 0, 0, 0, 0])
print(a2)
np.ones_like(a2)
>>
[[1 2 3]
 [4 5 6]
 [7 8 9]]
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
print(a3)
np.full_like(a3, 10)
>>
[[[1 2 3]
  [4 5 6]
  [7 8 9]]

 [[1 2 3]
  [4 5 6]
  [7 8 9]]

 [[1 2 3]
  [4 5 6]
  [7 8 9]]]
array([[[10, 10, 10],
        [10, 10, 10],
        [10, 10, 10]],

       [[10, 10, 10],
        [10, 10, 10],
        [10, 10, 10]],

       [[10, 10, 10],
        [10, 10, 10],
        [10, 10, 10]]])

 

생성한 값으로 배열 생성

  • arrange(): 정수 범위로 배열 생성
np.arange(0, 30, 2) #파이썬 range함수 -> array만들어지는 것임
>> array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
  • linespace(): 범위 내에서 균등 간격의 배열 새성
np.linspace(0, 1, 5) # 0~1 균등하게 5로 나눠
>> array([0.  , 0.25, 0.5 , 0.75, 1.  ])
  • logspace(): 범위 내에서 균등간격으로 로그 스케일로 배열 생성
np.logspace(0.1, 1, 20) 
>>
array([ 1.25892541,  1.40400425,  1.565802  ,  1.74624535,  1.94748304,
        2.1719114 ,  2.42220294,  2.70133812,  3.0126409 ,  3.35981829,
        3.74700446,  4.17881006,  4.66037703,  5.19743987,  5.79639395,
        6.46437163,  7.2093272 ,  8.04013161,  8.9666781 , 10.        ])

(참고)

 

[제어공학] 로그 스케일(log scale)이란 무엇인가? / 로그 스케일을 사용하는 이유 (GDP, S&P500, 데시벨

우리가 이제까지 쓰던 그래프들은 같은 간격을 가지는 그래프이다. 하지만, 그 간격이 커진다면 어떻게 될...

blog.naver.com

랜덤 값으로 배열 생성

함수 설명
seed 난수 발생을 위한 시드(seed) 지정
permutation 순서를 임의로 바꾸거나 임의의 순열 반환
shuffle 리스트나 배열의 순서를 뒤섞음
random 랜덤한 수의 배열 생성
rand 균등분포에서 표본 추출
randint 주어진 최소/최대 범위의 난수 추출
randn 표준편차가 1, 평균값 0인 정규분포의 표본 추출
binomial 이항분포에서 표본 추출
normal 정규분포(가우시안)에서 표본 추출
beta 베타분포에서 표본 추출
chisquare 카이제곱분포에서 표본 추출
gamma 감마분포에서 표본 추출
uniform 균등(0,1)분포에서 표본 추출

 정규 분포(normal distribution)

  •  가우시안 정규 분포 (Gaussian normal distribution) 라고도 한다
  •  자연 현상에서 나타나는 숫자를 확률 모형으로 나타낼 때 사용한다. 즉, 수집된 자료의 분포를 근사하는 데에 자주 사용
  • random.random(): 랜덤한 수의 배열 생성
np.random.random((3,3)) #랜덤 실수, shape만 정해주면 됨
>>
array([[0.7271253 , 0.09892615, 0.75553   ],
       [0.67868707, 0.84309241, 0.99616723],
       [0.51479988, 0.01097926, 0.5606317 ]])
np.random.random((3,3,3))
>> 
array([[[0.93534065, 0.85012904, 0.31395282],
        [0.09425532, 0.76641332, 0.66416117],
        [0.72384467, 0.9215196 , 0.01374308]],

       [[0.26621864, 0.85294657, 0.78039905],
        [0.87721404, 0.73255218, 0.76681427],
        [0.97882685, 0.83218069, 0.15288432]],

       [[0.09340093, 0.72066878, 0.41538735],
        [0.40401489, 0.0606457 , 0.56898089],
        [0.08620396, 0.11458599, 0.29468311]]])
  • random.randint(): 일정 구간의 랜덤 정수의 배열 생성
np.random.randint(0, 10, (3, 3)) #0~10까지 중에서, shape 은 3x3
>>
array([[1, 6, 7],
       [0, 0, 3],
       [8, 8, 8]])
  • random.normal(): 정규분포(normal distribution)를 고려한 랜덤한 수의 배열 생성
    • 평균=0, 표준편차=1, 3 x 3 배열
np.random.normal(0, 1, size = (3,3))
>>
array([[ 0.88083474, -0.85664921,  0.27137419],
       [-0.95776877, -0.30146982,  0.3882944 ],
       [-0.21252238, -1.11429329, -0.95773857]])
  • random.rand(): 균등분포(uniform distribution)를 고려한 랜덤한 수의 배열 생성
np.random.rand(3,3)
>>
array([[0.57739454, 0.17067861, 0.0566638 ],
       [0.1196071 , 0.97340677, 0.04527773],
       [0.81516978, 0.35257297, 0.4503461 ]])
  • random.randn(): 표준 정규 분포(standard normal distribution)를 고려한 랜덤한 수의 배열 생성
np.random.randn(3,3) 
>>
array([[ 0.13060454, -1.05810324, -0.61093906],
       [ 1.51612038,  0.46332077,  0.20927219],
       [ 0.18543729, -0.2137167 ,  0.42097537]])

표준 데이터 타입

데이터 타입 설명
bool_ 바이트로 저장된 불리언(Boolean)으로 True 또는 False 값을 가짐 
int_ 기본 정수(Integer) 타입
inte C 언어에서 사용되는 int 와 동일 (일반적으로 int32 또는 Int64)
intp 인덱싱에 사용되는 정수(C 언어에서 ssize_+ 와 동일; 일반적으로 int32 또는 int64)
int8 바이트(Byte) (-128 ~ 127)
int16 정수 (-32768~ 32767)
int32 부호 없는 정수(0~ 18446744073709551615)


int64 정수(9223:72086854775803 ~ 9223372036854775807
uint8 부호 없는 정수(0~ 255)
uint16 부호 없는 정수 (0~ 65535)
uint32 부호 없는 정수 (0~ 4294967295)
uint64 부호 없는 정수(0~ 18446744073709551615)
float16 반정밀 부동 소수점(Half precision float): 부호 비트, 5비트 지수, 10비트 가수
float32 단정밀 부동 소수점(Single precision float): 부호 비트, 8비트 지수, 23비트 가수 
float64 배정밀 부동 소수점(Double precision floal): 부호 비트, 11비트 지수, 52비트 가수
float_ float64 를 줄여서 표현
complex64 복소수(Complex number), 두 개의 32비트 부동 소수점으로 표현
complex128 복소수(Complex number), 두 개의 64비트 부동 소수점으로 표현
complex_ complex128를 줄여서 표현
np.zeros(20, dtype = int) #int값으로 표현
>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3,3), dtype = bool) # 1은 true 의미 
>>
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])
np.zeros((3,3), dtype = bool)
>>
array([[False, False, False],
       [False, False, False],
       [False, False, False]])
np.full((3,3), 1.0, dtype = float)
>>
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

날짜 / 시간 배열 생성

 

date = np.array('2020-01-01', dtype = np.datetime64)
date
>> array('2020-01-01', dtype='datetime64[D]')
date + np.arange(12)
>> 
array(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
       '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
       '2020-01-09', '2020-01-10', '2020-01-11', '2020-01-12'],
      dtype='datetime64[D]')

-> 날짜를 계산 가능한 형태로

datetime = np.datetime64('2023-02-01 12:00')
datetime
>> numpy.datetime64('2023-02-01T12:00')
datetime = np.datetime64('2022-06-01 12:00:12.45', 'ns')
datetime

>> numpy.datetime64('2022-06-01T12:00:12.450000000')

참고 영상

https://youtu.be/mirZPrWwvao