넘파이 배열 ndarray

it초보·2024년 7월 25일
0

python

목록 보기
1/1

넘파이 ndarray

ndarray: N차원(Dimension) 배열(Array) 객체

ndarray 생성

  • Numpy 모듈의 array() 함수로 생성
  • 인자로 주로 파이썬 list 또는 ndarray 입력

ndarray 형태(Shape)와 차원

  • ndarray의 shape는 ndarray.shape 속성으로, 차원은 ndarray.ndim 속성

실습

import numpy as np

list1 = [1, 2, 3]
print('list1 type: ', type(list1))

array1 = np.array(list1)
print('array1 type: ', type(array1))
print('array1 array 형태: ', array1.shape)

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

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

결과

list1 type: <class 'list'>
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)

실습

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

결과

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

ndarray 타입(type)

  • ndarray내의 데이터값은 숫자 값, 문자열 값, 불 값 등이 모두 가능

  • 숫자형의 경우 int형(8bit, 16bit, 32bit), unsigned int형(8bit, 16bit, 32bit), fload형(16bit, 32bit, 64bit, 128bit), 그리고 이보다 더 큰 숫자 값이나 정밀도를 위해 complex 타입도 제공.

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

  • ndarray내의 데이터 타입은 ndarray.dtype으로 확인 가능.

실습

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

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

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

결과

<class 'list'>
<class 'numpy.ndarray'>
[1 2 3] int32
['1' '2' 'test'] < U11
[1. 2. 3.] float64

ndarray 타입(type) 변환

astype()을 이용하여 변환

  • 변경을 원하는 타입을 astype()에 인자로 입력
  • 대용량 데이터를 ndarray로 만들 때 메모리를 절약하기 위해 자주 사용.
    0,1,2와 같이 크지 않는 범위의 숫자를 위해서 64bit float형 보다는 8bit또는 16bit의 integer 형으로 변환하는 것이 훨씬 메모리를 많이 절약하게 됨.

대용량 데이터 다룰 시 메모리 절약을 위해서 형변환을 특히 고려해야함.

실습

array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64') # array_int.astype(np.float64)
print(array_float, array_float.dtype)

array_int1= array_float.astype('int32')
print(array_int1, array_int1.dtype)

array_float1 = np.array([1.1, 2.1, 3.1])
array_int2= array_float1.astype('int32')
print(array_int2, array_int2.dtype)

결과

[1. 2. 3.] float64
[1 2 3] int32
[1 2 3] int32

넘파이 ndarray의 axis 축


  • ndarry는 shape는 행, 열, 높이 단위로 부여되는 것이 아니라 axis0, axis1, axis2 와 같이 axis 단위로 부여된다.

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

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

실습

sequence_array = np.arange(10)
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)

#(3, 2) shape을 가지는 모든 원소가 0, dtype은 int32 인 ndarray 생성.  
zero_array = np.zeros((3, 2), dtype='int32')
print(zero_array)
print(zero_array.dtype, zero_array.shape)

#(3, 2) shape을 가지는 모든 원소가 1인 ndarray 생성. ,
one_array = np.ones((3, 2))
print(one_array)
print(one_array.dtype, one_array.shape)

결과

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

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

  • reshape()는 ndarray를 특정 차원 및 형태로 변환한다. 변환 형태를 함수 인자로 부여

  • reshape(-1,5)와 같이 인자에 -1을 부여하면 -1에 해당하는 axis의 크기는 가변적이되 -1이 아닌 인자값(여기서는 5)에 해당하는 axis 크기는 인자값으로 고정하여 ndarray의 shape를 변환한다.

  • reshape()는 reshape(-1,1), reshape(-1,)과 같은 형식으로 변환이 요구되는 경우가 많다. 주로 머신러닝 API의 인자로 1차원 ndarray를 명확하게 2차원 ndarray로 변환하여 입력하기를 원하거나, 또는 반대의 경우가 있을 경우 reshape()를 이용하여 ndarray의 형태를 변환시켜 주는데 사용된다.

실습

array1 = np.arange(10)
print('array1:\n', array1)

# (2, 5) shape으로 변환
array2 = array1.reshape(2, 5)
print('array2:\n',array2)

#(5, 2) shape으로 변환. 
array3 = array1.reshape(5,2)
print('array3:\n',array3)

결과

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]]

실습

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

array2 = array1.reshape(-1,5)
print('array2 shape:',array2.shape)

array3 = array1.reshape(5,-1)
print('array3 shape:',array3.shape)

결과

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

실습

array1 = np.arange(8)
array3d = array1.reshape((2,2,2))
print('array3d:\n',array3d.tolist())

# 3차원 ndarray를 2차원 ndarray로 변환하되 칼럼갯수는 1
array5 = array3d.reshape(-1, 1)
print('array5:\n',array5.tolist())
print('array5 shape:',array5.shape)

# 1차원 ndarray를 2차원 ndarray로 변환화되 칼럼 갯수는 1
array6 = array1.reshape(-1, 1)
print('array6:\n',array6.tolist())
print('array6 shape:',array6.shape)

결과

array3d:
[[[0, 1], [2, 3]], [[4, 5], [6, 7]]]
array5:
[[0], [1], [2], [3], [4], [5], [6], [7]]
array5 shape: (8, 1)
array6:
[[0], [1], [2], [3], [4], [5], [6], [7]]
array6 shape: (8, 1)

실습

# 3차원 array를 1차원으로 변환
array1d = array3d.reshape(-1,)
print(array1d)

결과

[0 1 2 3 4 5 6 7]

데이터 세트 선택하기 - 인덱싱(indexing)

인덱싱 유형설명
특정 위치의 단일값 추출원하는 위치의 인덱스 값을 지정하면 해당 위치의 데이터가 반환된다.
슬라이싱(Slicing)슬라이싱은 연속된 인덱스상의 ndarray를 추출하는 방식이다.':' 기호 사이에 시작 인덱스와 종료 인덱스를 표시하면 시작 인덱스에서 종료 인덱스-1 위치에 있는 ndarry를 반환한다. 예를 들어 1:5라고 하면 시작 인덱스 1과 종료 인덱스 4까지에 해당하는 ndarray를 반환한다.
팬시 인덱싱(Fancy Indexing)일정한 인덱싱 집합을 리스트 또는 ndarray 형태로 지정해 해당 위치에 있는 ndarry를 반환한다.
불린 인덱싱(Boolean Indexing)특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 ndarry를 반환한다.

단일 값 추출 - 1차원 ndarray

  • ndarray는 axis를 기준으로 0부터 시작하는 위치 인덱스값을 가지고 있음. 해당 인덱스 값을 []에 명시하여 단일 값을 추출한다. 마이너스가 인덱스로 사용되면 맨 뒤에서 부터 위치를 지정한다.

단일 값 추출 - 2차원 ndarray

슬라이싱(Slicing) - 1차원 ndarray

  • 슬라이싱은 : 을 이용하여 연속된 값을 선택한다.

0개의 댓글