세상을 바꾸는 데이터

[Numpy] 넘파이 - ndarray 생성 및 데이터 타입 본문

ML/Numpy

[Numpy] 넘파이 - ndarray 생성 및 데이터 타입

Industriousness 2022. 1. 17. 23:29

가장 먼저 넘파이 모듈 임포트 한다.

import numpy as np

넘파이 차원


  • np.array( )

넘파이 array() 함수는 파이썬의 리스트와 같은 다양한 인자를 받아서 ndarray로 변환하는 기능을 수행한다.

생성된 ndarray 배열의 shape 변수는 ndarray의 크기와 ndarray 배열의 차원을 알 수 있다.

 

ndarray 생성 및 크기 확인

array1 = np.array([1,2,3]) # 1차원 배열
print('array1 type:',type(array1))
print('array1 array 형태:',array1.shape)

array2 = np.array([[1,2,3],
                  [2,3,4]]) # 2차원 배열
print('array2 type:',type(array2))
print('array2 array 형태:',array2.shape)

array3 = np.array([[1,2,3]]) # 1차원 배열
print('array3 type:',type(array3))
print('array3 array 형태:',array3.shape)

 

[Output]

array1 type: <class 'numpy.ndarray'>
array1 array 형태: (3,)
array2 type: <class 'numpy.ndarray'>
array2 array 형태: (2, 3)
array3 type: <class 'numpy.ndarray'>
array3 array 형태: (1, 3)

ndarray 차원 확인

  • ndarray.ndim

각 array의 차원을 ndarray.ndim을 이용해 확인한다.

print('array1: {:0}차원, array2: {:1}차원, array3: {:2}차원'.format(array1.ndim,array2.ndim,array3.ndim))

 

[Output]

array1: 1차원, array2: 2차원, array3:  2차원

ndarray의 데이터 타입

ndarray내의 데이터 타입은 dtype속성으로 확인할 수 있다.

※주의※

ndarray내의 데이터 타입은 그 연산의 특성상 같은 데이터 타입만 가능하다. 예를 들어 한 개의 ndarray 객체에 int와 float가 함께 있을 수 없다.

list1 = [1,2,3]
print(type(list1))
array1 = np.array(list1)

print(type(array1))
print(array1, array1.dtype)

print('########')

list2 = [1, 2, 'test']
array2 = np.array(list2)
print(array2, array2.dtype)

print('########')

list3 = [1, 2, 3.0]
array3 = np.array(list3)
print(array3, array3.dtype)

[Output]

<class 'list'> # list1의 데이터 타입 리스트
<class 'numpy.ndarray'> # array1의 데이터 타입 ndarray
[1 2 3] int32 # 변경된 array1 내의 데이터값은 모두 int32
########
['1' '2' 'test'] <U11 # array2 데이터와 데이터 타입
########
[1. 2. 3.] float64 # array3 데이터와 데이터 타입

ndarray를 편리하게 생성하기 - arange, zeros, ones

  • np.arange( )
  • np.zeros( )
  • np.ones( )

특정 크기와 차원을 가진 ndarray를 연속 값이나 0 또는 1로 초기화해 쉽게 생성해야 할 필요가 있는 경우가 발생할 수 있다. arange( ), zeros( ), ones( )는 주로 테스트용으로 데이터를 만들거나 대규모의 데이터를 일괄적으로 초기해해야 할 경우에 사용한다.

arange( )는 0부터 함수 인자 값 -1까지의 값을 순차적으로 ndarray의 데이터 값으로 변환해준다.

넘파이 arange( ) 참고자료

sequence_array = np.arange(10) # 0부터 1씩 더해 9까지 구성
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)

[Output]

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

 

zeros( )는 함수 인자로 튜플 형태의 shape 값을 입력하면 모든 값을 0으로 채우고, ones( )는 유사하게 모든 값을 1로 채운 해당 shape를 가진 ndarray로 반환시킨다.

3x3 행렬 모든 값이 0
2x2 행렬 모든 값이 1

zero_array = np.zeros((3,2),dtype='int32') # (3,2) 행렬에 모두 0으로 채운 배열
print(zero_array)
print(zero_array.dtype, zero_array.shape)

one_array = np.ones((3,2)) # (3,2) 행렬에 모두 1으로 채운 배열
print(one_array)
print(one_array.dtype, one_array.shape)

[Output]

[[0 0]
 [0 0]
 [0 0]]
int32 (3, 2)
[[1. 1.]
 [1. 1.]
 [1. 1.]]
float64 (3, 2)

ndarray의 차원과 크기를 변경하는 reshape( )

  • ndarray.reshape( )

reshape( ) 매서드는 ndarray를 특정 차원 및 크기로 변환한다. 만약 지정된 사이즈로 변경이 불가능하면 오류를 발생시킨다. 예를 들어 (15, ) 데이터를 (4, 4) shape 형태로 변경할 수 없다.

2x3 행렬을 3x2 행렬로 변환

array1 = np.arange(10) #  0부터 1씩 증가한 값들을 가진 원소 생성
print('array1:\n', array1)

array2 = array1.reshape(2,5) # 2x5행렬 변환
print('array2:\n',array2)

array3 = array1.reshape(5,2) # 5x2행렬 변환
print('array3:\n',array3)

[Output]

array1:
 [0 1 2 3 4 5 6 7 8 9]
array2:
 [[0 1 2 3 4]
 [5 6 7 8 9]]
array3:
 [[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

reshape( )를 실전에서 효율적으로 사용하는 경우는 인자를 -1로 적용시키는 경우이다. 물론 -1을 사용하더라도 호환될 수 없는 형태는 변환할 수 없다.

array1 = np.arange(10)
print(array1)

#컬럼 axis 크기는 5에 고정하고 로우 axis크기를 이에 맞춰 자동으로 변환. 즉 2x5 형태로 변환 
array2 = array1.reshape(-1,5)
print('array2 shape:',array2.shape)
print('array2:\n', array2)

#로우 axis 크기는 5로 고정하고 컬럼 axis크기는 이에 맞춰 자동으로 변환. 즉 5x2 형태로 변환 
array3 = array1.reshape(5,-1)
print('array3 shape:',array3.shape)
print('array3:\n', array3)

[Output]

[0 1 2 3 4 5 6 7 8 9]
array2 shape: (2, 5)
array2:
 [[0 1 2 3 4]
 [5 6 7 8 9]]
array3 shape: (5, 2)
array3:
 [[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

 

다음 포스트에서는 넘파이의 데이터 세트를 선택할 수 있는 인덱싱에 대해 다루어 보겠다.

 

Reference


https://github.com/chulminkw/PerfectGuide

https://ichi.pro/ko/numpy-array-cookbook-python-eseo-baeyeol-saengseong-mich-jojag-36927115397897

https://www.w3resource.com/numpy

 

728x90
반응형

'ML > Numpy' 카테고리의 다른 글

[Numpy] 넘파이 - 행렬(Matrix)  (1) 2022.01.19
[Numpy] 넘파이 - 인덱싱(Indexing)  (1) 2022.01.19
[Numpy] Intro  (2) 2022.01.17
Comments