본문 바로가기
대딩/DS

Numpy 배열 생성하기와 형태 변형하기

by 경아ㅏ 2021. 10. 30.

Numpy

numerical python, 행렬과 관련된 연산에 사용하는 python 라이브러리.
python 리스트를 이용한 연산보다 빠르며, 메모리를 적게 차지한다. 
Numpy Tutorials

 

 

Tip 💡

Numpy 실습은 jupyternotebook에서 하는 것이 가장 편리하다. 아직 jupyter를 설치하지 않은 분이 계시다면 jupyternotebook

 

 

배열 생성하기

 

np.array()

리스트 데이터를 활용하여 array를 생성할 수 있다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                 [4, 5, 6]])
ary

 

output: 

array([[1, 2, 3],
       [4, 5, 6]])

 

 

np.asarray()

np.array() 와 동일하게 array를 생성할 수 있다.

 

import numpy as np

ary = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])
ary

 

output: 

array([[1, 2, 3],
       [4, 5, 6]])

 

 

copy()

기존의 array를 복사하여 지정할 수 있다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                 [4, 5, 6]])

ary2 = ary.copy()
ary2

 

output: 

array([[1, 2, 3],
       [4, 5, 6]])

 

 

np.range()

start 부터 stop-1까지의 수들을 1차원 배열로 생성한다. 

 

import numpy as np

ary = np.arange(start=0, stop=10)
ary

 

output: 

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

 

start 값을 생략하여 함수를 실행하는 경우, start는 0으로 자동 세팅 된다.

 

import numpy as np

ary = np.arange(10)
ary

 

output: 

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

 

start 부터 stop까지 수들의 간격을 step 인자를 통해 지정할 수 있다.

 

import numpy as np

ary = np.arange(start=0, stop=10, step=2) #start에서 stop-1까지 step의 간격으로 배열 생성
ary

 

output: 

array([0, 2, 4, 6, 8])

 

 

np.linspace()

start에서 stop까지의 수 num개를 생성하되, 이들의 간격이 모두 동일하게 한다.

 

import numpy as np

ary = np.linspace(0, 1, 5)
ary

 

output: 

array([0.  , 0.25, 0.5 , 0.75, 1.  ])

 

 

np.eye()

단위행렬(대각선 요소가 모두 1이고 나머지 요소들은 모두 0인 행렬)을 생성한다.

 

import numpy as np

ary = np.eye(3)
ary

 

output: 

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

 

 

np.identity()

np.eye() 와 동일하게 단위 행렬을 생성한다.

 

import numpy as np

ary = np.identity(3)
ary

 

output: 

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

 

 

np.ones()

모든 요소가 1인 행렬을 생성한다.

 

import numpy as np

ary = np.ones((3, 4))
ary

 

output: 

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

 

 

np.zeros()

모든 요소가 0인 행렬을 생성한다.

 

import numpy as np

ary = np.zeros((3, 4))
ary

 

output: 

array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

 

 

np.full()

특정 숫자로 채워진 행렬을 생성한다.

 

import numpy as np

ary = np.full((3, 4), 4)
ary

 

output: 

array([[4, 4, 4, 4],
       [4, 4, 4, 4],
       [4, 4, 4, 4]])

 

 

np.diag()

대각선에만 값이 존재하고 나머지 요소들은 0인 대각행렬(diagonal matrix)를 생성한다.

 

import numpy as diag

ary = np.diag((3, 4, 5))
ary

 

output: 

array([[3, 0, 0],
       [0, 4, 0],
       [0, 0, 5]])

 

 

배열의 속성 확인하기

배열의 원소 개수와 차원, 모양 확인하기

 

import numpy as np

ary = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])

print(ary.size)  # 요소의 개수
print(ary.ndim)  # 차원
print(ary.shape) # x축과 y축의 원소 개수

 

output: 

6
2
(2, 3)

 

 

배열의 속성 및 모양 바꾸기

 

astype()

배열의 데이터 타입을 수정한다. 새로운 데이터 타입은 numpy scalars의 Sized aliases 참고

 

import numpy as np

ary1 = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])

ary2 = ary.astype(dtype=np.float32) # type을 float32로 수정

print("ary1 type:", ary1.dtype)
print("ary2 type:", ary2.dtype)

print("\nary1:\n", ary1)
print("\nary2:\n", ary2)

 

output:

ary1 type: int64
ary2 type: float32

ary1:
 [[1 2 3]
 [4 5 6]]

ary2:
 [[1. 2. 3.]
 [4. 5. 6.]]

 

위의 경우,  배열 내 int64(정수형) 자료형의 요소들을 float32(실수형)으로 바꾸어주었다.

 

 

reshape()

배열의 모양을 수정한다. 2 x 3 매트릭스를 3 x 2 매트릭스로 바꾸어보자.

 

import numpy as np

ary = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])


ary2 = ary.reshape(3, 2)
ary2

 

output:

array([[1, 2],
       [3, 4],
       [5, 6]])

 

reshape 할 때 주의할 점은, 새로운 모양을 가지는 배열에서도 이전의 원소를 모두 포함할 수 있어야 한다는 것이다.

예를 들어, 6개의 요소를 가지는 2 x 3 행렬은 1 x 6, 3 x 2, 6 x 1 등 으로만 변환 될 수 있다.

 

 

flatten()

2차원 이상의 행렬을 1차원 배열로 변형한다.

 

import numpy as np

ary1 = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])


ary2 = ary1.flatten()
ary2

 

output:

array([1, 2, 3, 4, 5, 6])

 

 

reval()

2차원 이상의 행렬을 1차원 배열로 변형한다. flatten() 과의 차이점은 reval() 함수를 통해 리턴된 배열은 원래의 배열과 메모리를 공유하고 있다는 점이다. 따라서 아래의 코드에서 ary2의 요소를 변형할 경우 ary1의 요소도 자동적으로 바뀌게 된다.

 

import numpy as np

ary1 = np.asarray([[1, 2, 3], 
                 [4, 5, 6]])


ary2 = ary1.ravel()
ary2

 

output:

array([1, 2, 3, 4, 5, 6])

 

 

np.concatenate

벡터 및 행렬을 가로, 혹은 세로로 결합할 수 있다.

 

 

- 1차원 행렬(벡터)의 병합

import numpy as np

ary = np.array([1, 2, 3])
conary = np.concatenate((ary, ary), axis=0)
conary

 

output:

array([1, 2, 3, 1, 2, 3])

 

 

- 2차원 행렬의 세로 병합

import numpy as np

ary = np.array([[1, 2, 3], 
                [4, 5, 6]])
conary = np.concatenate((ary, ary), axis=0)
conary

 

output:

array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])

 

 

- 2차원 행렬의 가로 병합

import numpy as np

ary = np.array([[1, 2, 3], [4, 5, 6]])
conary = np.concatenate((ary, ary), axis=1)
conary

 

output:

array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])

 

 

np.hstack()

행렬을 수평으로(가로로) 결합하여 쌓는다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                [4, 5, 6]])
st = np.hstack([ary, ary, ary])
st

 

output:

array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6, 4, 5, 6]])

 

 

np.vstack()

행렬을  수직으로(세로로) 결합하여 쌓는다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                [4, 5, 6]])
st = np.vstack([ary, ary, ary])
st

 

output:

array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])

 

 

원소 삽입하기와 원소 제거하기

np.insert()와 np.delete() 를 이용하여 원소를 추가, 제거해보자.

 

 

np.insert()

특정 인덱스(0부터 시작)에 원소들을 삽입한다. 이 때 리턴되는 행렬은 1차원으로 변환된다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                [4, 5, 6]])

insert = np.insert(ary, 6, [7, 8]) # 인덱스 6번에 원소 7과 8을 추가
insert

 

output:

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

 

 

np.delete()

특정 인덱스(0부터 시작)의 원소를 제거한다. 이 때 리턴되는 행렬은 1차원으로 변환된다.

 

import numpy as np

ary = np.array([[1, 2, 3], 
                [4, 5, 6]])

delete = np.delete(ary, 3) #인덱스 3번 원소인 4를 제거
delete

 

output:

array([1, 2, 3, 5, 6])

 

 

관련 포스트

[Numpy:1.20.1] Numpy 기초(Indexing, Boolean Indexing, Fancy Indexing)

 

 

참고

Numpy 공식 documents

댓글