이수안컴퓨터연구소의 NumPy 한번에 끝내기 영상을 보고 정리한 내용입니다.
✅ 배열 값 삽입
✔️ numpy.insert()
배열에 값을 삽입하는 것은 insert() 메서드를 통해 이루어진다.
insert() 메서드는 배열의 특정 위치에 값을 삽입하며 추가할 방향을 axis로 지정한다.
axis를 지정하지 않으면 1차원 배열로 변환한다.
insert() 메서드는 원본 배열의 변경 없이 값이 추가된 새로운 배열을 반환한다.
numpy.insert(arr, obj, values, axis=None)
- arr : 값을 삽입할 배열.
- obj : 정수 혹은 일련의 정수들. 값을 삽입할 index.
- values : array_like. 삽입할 값.
- axis : 옵션. 값을 삽입할 축.
print(a1)
b1 = np.insert(a1, 0, 10)
print(b1)
# output
# [1 2 3 4 5]
# [10 1 2 3 4 5]
insert() 메서드를 이용해서 a1의 0번째 인덱스에 10이라는 값을 삽입한 결과를 b1에 저장하였다.
이후 b1을 출력하면 a1의 0번째 인덱스에 10이라는 값이 추가된 형태임을 확인할 수 있다.
print(a2)
b2 = np.insert(a2, 1, 10, axis=0)
print(b2)
c2 = np.insert(a2, 1, 10, axis=1)
print(c2)
d2 = np.insert(a2, 1, 10)
print(d2)
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[ 1 2 3]
# [10 10 10]
# [ 4 5 6]
# [ 7 8 9]]
# [[ 1 10 2 3]
# [ 4 10 5 6]
# [ 7 10 8 9]]
# [ 1 10 2 3 4 5 6 7 8 9]
3x3의 2차원 배열인 a2에 각각 다른 axis 옵션을 주고 insert() 메서드를 적용한 결과이다.
axis가 0일 때는 행에, axis가 1일 때는 열에 값의 삽입이 이루어졌다.
axis를 지정하지 않았을 때는 1차원 배열로 변환된 것도 확인할 수 있다.
✅ 배열 값 수정
배열의 값을 수정하는 것은 인덱싱을 통해 할 수 있다.
다음은 1차원 배열인 a1과 2차원 배열인 a2에 인덱싱을 통해 값을 수정한 결과이다.
print(a1)
a1[0] = 6
print(a1)
a1[:-1] = 9
print(a1)
i = np.array([1, 2])
a1[i] += 1
print(a1)
i = np.array([0, 1, 2, 3])
a1[i] = i+1
print(a1)
# output
# [1 2 3 4 5]
# [6 2 3 4 5]
# [9 9 9 9 5]
# [ 9 10 10 9 5]
# [1 2 3 4 5]
print(a2)
a2[0, 0] = 1
a2[1, 1] = 2
a2[2, 2] = 3
a2[0] = 1
print(a2)
a2[1:, 2] = 9
print(a2)
row = np.array([0, 1])
col = np.array([1, 2])
a2[row,col] = 0
print(a2)
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1 1 1]
# [4 2 6]
# [7 8 3]]
# [[1 1 1]
# [4 2 9]
# [7 8 9]]
# [[1 0 1]
# [4 2 0]
# [7 8 9]]
✅ 배열 값 삭제
✔️ numpy.delete()
값을 삭제하는 것은 delete() 메서드를 통해 이루어진다.
delete() 메서드는 배열 내 특정 위치의 값을 삭제하며 삭제할 방향을 axis로 지정한다.
insert()와 동일하게 axis를 지정하지 않으면 1차원 배열로 변환하며 원본 배열의 변경 없이 값이 삭제된 새로운 배열을 반환한다.
numpy.delete(arr, obj, axis=None)
- arr : 값을 삭제할 배열.
- obj : 정수 혹은 일련의 정수들. 값을 삭제할 index.
- axis : 옵션. 값을 삭제할 축.
print(a1)
b1 = np.delete(a1, 1)
print(b1)
# output
# [1 2 3 4 5]
# [1 3 4 5]
delete() 메서드를 이용해서 a1의 1번째 인덱스 값을 삭제한 결과를 b1에 저장했다.
이후 b1을 출력하면 a1의 1번째 인덱스 값이 삭제된 형태임을 확인할 수 있다.
print(a2)
b2 = np.delete(a2, 1, axis=0)
print(b2)
c2 = np.delete(a2, 1, axis=1)
print(c2)
d2 = np.delete(a2, 1)
print(d2)
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1 2 3]
# [7 8 9]]
# [[1 3]
# [4 6]
# [7 9]]
# [1 3 4 5 6 7 8 9]
3x3의 2차원 배열인 a2에 각각 다른 axis 옵션을 주고 delete() 메서드를 적용한 결과이다.
axis가 0일 때는 행에, axis가 1일 때는 열에 대해 값의 삭제가 이루어졌다.
axis를 지정하지 않았을 때는 해당 인덱스의 값이 삭제된 1차원 배열이 출력된 것도 확인할 수 있다.
✅ 배열 복사
파이썬의 리스트 자료형과 달리 NumPy 배열의 슬라이싱은 복사본이 아니다.
파이썬의 리스트 자료형은 슬라이싱의 결과를 원본 배열에 적용하는 것이 아니라 원본 배열의 복사본으로 슬라이싱한 결과를 리턴한다.
하지만 NumPy에서는 슬라이싱한 결과를 다른 배열에 저장해도 슬라이싱의 결과가 원본 배열에 영향을 준다.
print(a2)
a2_sub = a2[:2, :2]
print(a2_sub)
a2_sub[:, 1] = 0
print(a2_sub)
print(a2)
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1 2]
# [4 5]]
# [[1 0]
# [4 0]]
# [[1 0 3]
# [4 0 6]
# [7 8 9]]
위의 예제에서 a2를 슬라이싱한 것을 a2_sub에 저장 후 출력했다.
a2_sub에 원하는 값이 들어가 있는 것을 확인한 후 a2_sub의 값을 일부분 변경하였다.
이때 a2_sub와 a2를 출력해보면 a2_sub의 값을 변경했음에도 a2의 값까지 바뀐 것을 확인할 수 있다.
따라서 원본 배열에 영향을 주지 않도록 복사본을 만들기 위해서 copy() 메서드를 사용한다.
copy() 메서드는 배열이나 하위 배열 내의 값을 명시적으로 복사한다.
print(a2)
a2_sub_copy = a2[:2, :2].copy()
print(a2_sub_copy)
a2_sub_copy[:, 1] = 0
print(a2_sub)
print(a2)
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1 2]
# [4 5]]
# [[1 0]
# [4 0]]
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
따라서 copy() 메서드를 사용하면 이전과는 달리 원본 배열의 복사본이 생성되어 슬라이싱의 결과를 원본 배열에 영향을 주지 않게 할 수 있다.
🔍 참조
numpy.insert https://numpy.org/doc/stable/reference/generated/numpy.insert.html
numpy.delete https://numpy.org/doc/stable/reference/generated/numpy.delete.html
'Python > NumPy' 카테고리의 다른 글
[NumPy] 배열 변환 - (2) (0) | 2022.02.02 |
---|---|
[NumPy] 배열 변환 - (1) (0) | 2022.01.24 |
[NumPy] 인덱싱과 슬라이싱 (0) | 2022.01.23 |
[NumPy] 배열 생성 - (2) (0) | 2022.01.23 |
[NumPy] 배열 생성 - (1) (0) | 2022.01.22 |
댓글