python

[numpy] 2차원 배열 | 삭제, 추가, 삽입 | np.delete(), np.append(), np.insert()

전감자(◔◡◔) 2022. 9. 28. 19:09

1. 삭제 

-2차원에서의 삭제는 1차원과 다르게 축 (axis)을 설정해주지 않으면 flatting 된다는 것을 기억해야한다. 

'''
    1. ndarray 삭제 ( axis 개념 반드시 이해하기 )
       new_arr = np.delete(arr, idx|fancy|slice , axis=None|0|1)
        - 삭제된 새로운 ndarray 반환함
        - 삭제옵션은 인덱싱,fancy,슬라이싱 모두 가능
          슬라이싱 np.s_[start:stop] 형식을 사용
       ===> 기본적으로 위치값으로 삭제한다.
       ==> 순방향, 역방향 모두 가능하다.
       ==> axis=None 기본 ( 일반적인 기본값은 axis=0 )이다.
         axis값을 지정하지 않으면 flat된다. ( 1차원으로 변경 )
       ==> axis=0  ==> 행이 삭제
       ==> axis=1  ==> 열이 삭제
'''
import numpy as np

arr = np.arange(25).reshape((5,5))
print(arr)
'''
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
'''
# 가. axis=None (기본 )
# 1. idx 삭제
new_arr = np.delete(arr, -1)
print(new_arr) # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

# 2. fancy 삭제
new_arr = np.delete(arr, [0,-1])
print(new_arr) # [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

# 3. 슬라이싱 삭제
new_arr = np.delete(arr, np.s_[:8])
print(new_arr) # [ 8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

'''
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
'''

# 나. axis=0 ==> 행 삭제
# 1. idx 삭제
new_arr = np.delete(arr, -1, axis=0) # 가장 마지막 행 삭제
print(new_arr)
'''
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
'''
# 2. fancy 삭제
new_arr = np.delete(arr, [0,-1], axis=0) # 첫번째 행과 마지막 행 삭제
print(new_arr)
'''
[[ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
'''
# 3. 슬라이싱 삭제
new_arr = np.delete(arr, np.s_[:3], axis=0) # 0행 ~ 2행 삭제
print(new_arr)
'''
[[15 16 17 18 19]
 [20 21 22 23 24]]
'''

'''
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
'''

# 다. axis=1 ==> 열 삭제
# 1. idx 삭제
new_arr = np.delete(arr, -1, axis=1) # 가장 마지막 열 삭제
print(new_arr)
'''
[[ 0  1  2  3]
 [ 5  6  7  8]
 [10 11 12 13]
 [15 16 17 18]
 [20 21 22 23]]
'''

# 2. fancy 삭제
new_arr = np.delete(arr, [0,-1], axis=1) # 첫번째 열과 마지막 열 삭제
print(new_arr)
'''
[[ 1  2  3]
 [ 6  7  8]
 [11 12 13]
 [16 17 18]
 [21 22 23]]
'''

# 3. 슬라이싱 삭제
new_arr = np.delete(arr, np.s_[:3], axis=1) # 0행 ~ 2행 삭제
print(new_arr)
'''
[[ 3  4]
 [ 8  9]
 [13 14]
 [18 19]
 [23 24]]
'''

 

2. 추가 및 삽입

 

 

삭제와 마찬가지로 axis를 설정해주지 않으면 flatting되고 , 

axis를 설정하여 추가 및 삽입을 하게되면 연산 개수를 맞추기 위해서 자동으로 broadcasting 된다

 

'''
배열 추가 및 삭제

1. 추가
    np.append(arr,값(리스트포함),axis=None|0|1)

    axis=None이면 flat 된 후에 추가된다.
    axis=0이면 행 추가 (주의할 점은 dimension 일치해야한다.)

2. 삽입
    np.insert(arr,리스트,팬싱,슬라이싱,인덱싱)

'''

import numpy as np

arr=np.arange(6).reshape((-1,3))
print(arr)
'''
[[0 1 2]
 [3 4 5]]
'''

# 가. axis=None ==> flat 된 후 처리됨
new_arr=np.append(arr,100)
print(new_arr)#[  0   1   2   3   4   5 100]
new_arr=np.append(arr,[100,200,300])#[  0   1   2   3   4   5 100 200 300]
print(new_arr)

# 나. axis=0 ==> 행 추가
#2차원 배열에 행을 추가할 때는 2차원 형태로 저장해야한다.
#new_arr=np.append(arr,[100,200,300],axis=0) #1차원 형태로 넣으면 안된다.#ValueError

new_arr=np.append(arr,[[100,200,300]],axis=0)#[  0   1   2   3   4   5 100 200 300]
new_arr=np.append(arr,[[100,200,300],[1,2,3],[243,453,567]],axis=0)
print(new_arr)
'''
[[  0   1   2]
 [  3   4   5]
 [100 200 300]]
'''

# 나. axis=1 ==> 열 추가
# 2차원 배열에 열을 추가 할 때는 2차원 형태로 지정해야 된다.
'''
[[0 1 2]
 [3 4 5]]
'''

new_arr=np.append(arr,[[100],[200]],axis=1)
new_arr=np.append(arr,[[100,99,98],[200,198,199]],axis=1)
print(new_arr)
'''
[[  0   1   2 100]            [[  0   1   2 100  99  98]
[  3   4   5 200]]             [  3   4   5 200 198 199]]

'''

### 삽입
# 가. axis=None ==> flat된 후 처리됨
new_arr=np.insert(arr,0,100)
print(new_arr)#[100   0   1   2   3   4   5]
print()
# 나. axis=0 ==> 특정 위치에 행 추가
# 브로드캐스팅(broadcasting): 연산하기 위해서 갯수를 자동으로 증가시킴 (demension 을 자동으로 맞춤)
new_arr=np.insert(arr,0,99,axis=0)
print(new_arr)
'''
[[99 99 99]
 [ 0  1  2]
 [ 3  4  5]]
'''

# 나. axis=1 ==> 특정 위치에 열 삽입
# 브로드캐스팅(broadcasting): 연산하기 위해서 갯수를 자동으로 증가시킴 (demension 을 자동으로 맞춤)
new_arr=np.insert(arr,0,99,axis=1)
print(new_arr)
'''
[[99  0  1  2]
 [99  3  4  5]]
'''