Python-Numpy(3)

백동윤·7일 전

Python

목록 보기
15/17
post-thumbnail

03. Numpy

3-1. 배열의 형태 변형과 차원 확장/축소

import numpy as np

array.ravel()

  • 다차원 배열을 1차원 배열로 펼침
  • 결과를 view로 변환(view 변경 시 원본도 변경됨)
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)

flat = a.ravel()
print(flat)

flat[2] = 100
print(flat)
print(a)

array.flatten()

  • 다차원 배열을 1차원 배열로 펼침
  • 결과를 복사본으로 반환(복사본 변경 시 원본은 변경되지 않음 = 독립적인 존재)
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(a)

flat = a. flatten()
print(flat)

flat[4] = 0
print(flat)
print(a)

np.expand_dims(a, axis)

  • 지정한 위치에 차원 추가 (차원 확장)
  • 추가되는 차원은 1
a = np.array([[1, 2, 3], [4, 5, 6]])
print("원본: ", a.shape)

# axis = 0
a0 = np.expand_dims(a, axis = 0)
print("a0", a0.shape)
print("a0", a0)

# axis = 1
a1 = np.expand_dims(a, axis = 1)
print("a2", a1.shape)
print("a1", a1)

# axis = 2
a2 = np.expand_dims(a, axis = 2)
print("a2", a2.shape)
print("a2", a2)

np.squeeze(a, axis)

  • 배열에서 크기가 1인 차원을 제거해주는 함수 (차원 축소)
a = np.array([[[[1], [2], [3]]], [[[1], [2], [3]]]])
print(a.shape) # (2, 1, 3, 1)

s = np.squeeze(a)
print(s)
print(s.shape)
# axis 지정하는 경우
a2 = np.zeros((1, 4, 1, 2))
print(a2.shape)

s1 = np.squeeze(a2, axis = 0)
print(s1.shape)

s2 = np.squeeze(a2, axis = 2)
print(s2.shape)

# 차원의 크기가 1이 아닌 차원은 제거할 수 없다
# s3 = np.squeeze(a2, axis = 1)
# print(s3.shape)

np.unique()

  • 배열에서 중복된 요소를 제거
a = np.array([1, 1, 1, 5, 5, 2, 2, 2, 2, 4, 4, 4, 3, 3, 3])
u1 = np.unique(a) # 고유값의 오름차순 배열 반환
print(u1)

u2, idx, inv, cnt = np.unique(a, return_index = True, return_inverse = True, return_counts = True)
print("인덱스: ", idx)
print("원본의 고유값 인덱스:", inv)
print("값의 등장 횟수: ", cnt)
실습 1-1
arr = np.array([[10, 20], [30, 40], [50, 60]])

flat1 = arr.ravel()
print(flat1)
flat1[0] = 999
print(flat1)

flat2 = arr. flatten()
print(flat2)
flat2[0] = 999
print(flat2)

결과

실습 1-2
img = np.random.rand(32, 32)
new_img = np.expand_dims(img, axis = 0)
print("img", new_img.shape)

결과

실습 1-3
img = np.random.randint(0, 255, (1, 28, 28, 1))
new_img = np.squeeze(img)
print(new_img.shape)

결과

실습 1-4
arr = np.array([[3, 1, 2, 2],
                [1, 2, 3, 1],
                [2, 2, 1, 4]])
flat = arr.flatten()
print(flat)

uni1 = np.unique(flat)
print(uni1)

uni2 = uni1.reshape(1, len(uni1))
# -1을 입력할 시 자동으로 계산함
print(uni2)

결과

실습 1-5
arr = np.array([[[1], [3], [2], [1], [3], [2], [3], [1], [2], [3]]]) # shape (1, 10, 1)
arrrrr = np.squeeze(arr)
print(arrrrr)
eigen = np.unique(arrrrr)
print(eigen)

결과

실습 1-6
arr = np.array([ [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]],
[[3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8]] ]) # shape (2, 3, 4)
flat = arr.flatten()
print(flat)
eigenn = np.unique(flat)
print(eigenn)
eigennn = eigenn.reshape(len(eigenn), 1)
print(eigennn)

결과

3-2. 배열의 결합과 분리

np.concatenate()

  • 배열 시퀀스를 결합
  • 기존 구조 안에서 결합
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

result1 = np.concatenate((a, b), axis = 0) # 행 기준 결합
print(result1)
print(result1.shape)

# 결합이 불가 -> 결합하는 axis를 제외한 나머지 차원이 같아야 함
# result2 = np.concatenate((a, b), axis = 1)

c= np.array([[7], [8], [9]])
result3 = np.concatenate((result1, c), axis = 1) # 열 기준 결합
print(result3)
print(result3.shape)
# np.stack()
# 새로운 차원을 추가하면서 결합

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

# axis = 0
s1 = np.stack((a, b), axis = 0)
print(s1)
print(s1.shape)

# axis = 1
s2 = np.stack((a, b), axis = 1)
print(s2)
print(s2.shape)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

hstack()

  • 열 방향(가로)로 결합
h = np.hstack((a, b))
print(h)

vstack()

  • 행 방향(세로)로 결합
v =np.vstack((a, b))
print(v)

np.split()

  • 배열을 여러 개의 하위 배열로 분할
a = np.arange(9)
s = np.split(a, 3)

print(a)
print(s)
print(s[0])
print(s[1])
print(s[2])
    
# 같은 크기의 행, 열 단위로만 나눌 수 있음
# s2 = np.split(a, 4)
a = np.arange(16).reshape(4, 4)
print(a)

s1 = np.split(a, [1, 3])
print(s1)
for part in s1:
    print(part)
실습 2-1
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

v =np.vstack((a, b))
print(v)

결과

실습 2-2
a = np.arange(12)
s = np.split(a, 3)
print(s)

결과

실습 2-3
a = np.array([1, 2])
b = np.array([3, 4])
c = np.array([5, 6])

s = np.stack((a, b, c), axis = 0)
print(s)
print(s.shape)

결과

실습 2-4
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
c = np.stack((a, b), axis = 0)
print(c)
print(c.shape)

결과

실습 2-5
arr = np.arange(8)
sizes = [2, 3, 3]
indices = []
num = 0

for size in sizes[:-1]:
    num += size
    indices.append(num)

split = np.split(arr, indices)
print(split)

결과

실습 2-6
a = np.ones((2, 3))
b = np.zeros((2, 3))
c = np.stack((a, b), axis = 0)
print(c.shape)
d = np.stack((a, b), axis = 1)
print(d.shape)

결과

3-3. 배열의 정렬

np.sort(array)

  • 정렬된 복사본 반환

array.sort()

  • 원본 배열을 정렬

1차원 배열

a = np.array([3, 1, 4, 2])

# 정렬한 배열을 반환
s = np.sort(a)
print(s)
print(a)

# 원본을 정렬
a.sort()
print(a)

# 내림차순 정렬: sort한 후 배열을 뒤집어야 함
print(a[::-1])
# 2차원 배열 정렬
a = [[6, 5, 4], [3, 1, 2]]
s1 = np.sort(a, axis = 0)
print(s1)
s2 = np.sort(a, axis = 1)
print(s2)

np.argsort()

  • 정렬 인덱스를 반환
a = np.array([3, 5, 1, 2, 4])
idx = np.argsort(a)
print(idx)
print(a[idx])

결과

실습 3-1
arr = np.array([7, 2, 9, 4, 5])
a = np.sort(arr)
print(a)
b = a[::-1]
print(b)

결과

실습 3-2
arr = np.array([[9, 2, 5],
[3, 8, 1]])
s = np.sort(arr, axis = 0)
print(s)

결과

실습 3-3
arr = np.array([10, 3, 7, 1, 9])
idx = np.argsort(arr)
print(idx)
print(arr[idx])

결과

실습 3-4
arr = np.array([[4, 7, 2],
[9, 1, 5],
[6, 8, 3]])
s = np.sort(arr, axis = 0)
print(s)

결과

profile
동윤2입니다.

0개의 댓글