[Numpy] 배열의 복사

1 minute read

Numpy ndarray의 복사에 대해 정리한 글입니다.

배열에서 복사를 할때, =, view(), copy()의 차이를 정리하고자 작성하게 되었습니다.

=

>>> import numpy as np

>>> arr = np.array([1,2,3])
>>> new = arr
>>> new[0] = 3

배열 arr을 선언하고, new 라는 배열에 arr을 복사합니다. 그리고, new의 첫번째 값을 1이 아닌 3으로 바꾸어 주었습니다.

>>> arr
array([3, 2, 3])
>>> new
array([3, 2, 3])

그렇다면, new 뿐만 아니라, arr도 같이 바뀌게 됩니다. 따라서 new 배열에 새로운 주소를 할당하고 arr과 개별적으로 수정을 원한다면 = 으로 값을 복사하면 안됩니다.

ndarray.view()

numpy에 view라는 메소드도 복사를 할 때 쓰입니다.

앞에서 했던 것을 view()를 써서 그대로 해보았습니다.

>>> arr = np.array([1,2,3])
>>> new = arr.view()
>>> new[0] = 3
>>> arr
array([3, 2, 3])
>>> new
array([3, 2, 3])

=으로 복사를 했을 때와 똑같은 결과를 보입니다. 하지만, =과는 다른 점이 있습니다.

view 메소드를 살펴보면 다음과 같습니다.

ndarray.view(dtype=None, type=None)

New view of array with the same data

dtype에 data type이나 ndarray sub-class를 파라미터로 넣어서 원래의 type을 바꿔줄 수 있고, type 자리에는 python type을 넣어서 returned view를 바꿔줄 수 있습니다. (ndarray 또는 Matrix)

>>> arr = np.array([1,2,3,4], dtype='int16')
>>> new = arr.view('int32')
>>> arr
array([1, 2, 3, 4], dtype=int16)
>>> new
array([131073, 262147], dtype=int32)

view 메소드를 이용하여 new 배열에서 보이는 view를 새롭게 하는 것입니다.

ndarray.copy()

앞에서와 같이 같은 주소를 공유하는 것이 아닌, 새로운 주소를 할당하여 배열을 복사하고 싶다면 copy()를 쓰면 됩니다.

numpy.copy(a, order='K')

앞에서 작성했던 코드를 copy를 이용하여 작성하면 다른 결과를 보입니다.

>>> arr = np.array([1,2,3])
>>> new = arr.copy()
>>> new[0] = 3
>>> arr
array([1, 2, 3])
>>> new
array([3, 2, 3])

new값을 바꿔도 더이상 arr 값이 바뀌진 않습니다.

따라서, 만약 값만 복사하고 완전 새로운 배열 생성을 원할 경우에는 copy()를 사용하는 것이 좋습니다. 추가적으로 PyTorch에도 tensor를 복사할 때, clone()이라는 것이 있습니다.

Leave a comment