np.array와 np.asarray의 차이
업데이트:
카테고리: python
그동안 넘파이를 사용하면서 array와 asarray의 차이가 궁금했었다.. 근데 매번 그냥 넘어갔던 것 같아서 이번에 확실히 정리하려고 한다.
np.array에 대해
np.array는 copy.deepcopy처럼 데이터 자체를 복사하는 개념이다. 혹시 deepcopy에 대해 잘 모른다면 게시글을 보고 오자. 예시를 보자.
import numpy as np
arr =[[1,2,3,4],[5,6,7,8]]
arr = np.array(arr,dtype=np.float32)
print("원본 데이터 : ")
print(arr)
print("원본 데이터 타입 : {}".format(arr.dtype))
print("-"*20)
# array는 무조건 copy.deepcopy 처럼 데이터 자체를 복사하는 개념이다.
np_array = np.array(arr)
arr[1] = arr[1]*2
print("수정된 원본 데이터 : ")
print(arr)
print("수정된 원본 데이터 타입 : {}".format(arr.dtype))
print("np.array 데이터 : ")
print(np_array)
print("np.array 데이터 타입 : {}".format(np_array.dtype))
print("-"*20)
출력 결과는 다음과 같다. 원본 데이터와 타입을 그대로 복사했기 때문에, 원본 데이터가 수정되어도 np.array에는 전혀 영향을 미치지 않는다.
원본 데이터 :
[[1. 2. 3. 4.]
[5. 6. 7. 8.]]
원본 데이터 타입 : float32
--------------------
수정된 원본 데이터 :
[[ 1. 2. 3. 4.]
[10. 12. 14. 16.]]
수정된 원본 데이터 타입 : float32
np.array 데이터 :
[[1. 2. 3. 4.]
[5. 6. 7. 8.]]
np.array 데이터 타입 : float32
--------------------
np.asarray에 대해
np.asarray는 2가지 사용방법이 있다.
1. 그냥 쓰거나, 데이터 타입을 같은 형식으로
말 그대로 asarray를 그냥 쓰거나, 데이터 타입을 같은 형식으로 가져가면 원본 데이터의 포인팅의 개념으로 사용된다. 바로 예시를 보자. 참고로 예시들은 np.array와 np.asarray 모두 하나의 코딩으로 되어있다. 그래서 arr를 계속 공유한다.
# asarray는 그냥 쓰거나, 데이터 타입을 같은 형식으로 가져가면 포인팅의 개념이다.
# 그래서 원본의 값을 변경하면 같이 값이 수정된다.
np_asarray = np.asarray(arr)
arr[0] = arr[0] - 4
print("수정된 원본 데이터 : ")
print(arr)
print("수정된 원본 데이터 타입 : {}".format(arr.dtype))
print("np.asarray 데이터 : ")
print(np_asarray)
print("np.asarray 데이터 타입 : {}".format(np_asarray.dtype))
print("-"*20)
출력 결과는 다음과 같다. asarray는 포인팅의 개념으로 사용됐기 때문에 원본이 수정되면 같은 데이터를 따라가는 것을 볼 수 있다.
수정된 원본 데이터 :
[[-3. -2. -1. 0.]
[10. 12. 14. 16.]]
수정된 원본 데이터 타입 : float32
np.asarray 데이터 :
[[-3. -2. -1. 0.]
[10. 12. 14. 16.]]
np.asarray 데이터 타입 : float32
--------------------
2. 데이터 타입을 다른 형식으로
말 그래도 asarray의 데이터 타입을 복사한 원본과 다른 형식으로 가져가게 되면, np.array처럼 복사의 개념으로 사용된다. 바로 예시를 보자.
# asarray는 데이터 타입을 다른 형식으로 가져가면 np.array와 같은 복사의 개념이다.
# 그래서 원본의 값을 변경해도 값이 수정되지 않는다.
np_asarray_another = np.asarray(arr,dtype=np.int32)
arr[0] = arr[0] * 2
print("수정된 원본 데이터 : ")
print(arr)
print("수정된 원본 데이터 타입 : {}".format(arr.dtype))
print("데이터 타입이 다른 np.asarray 데이터 : ")
print(np_asarray_another)
print("np.asarray 데이터 타입 : {}".format(np_asarray_another.dtype))
print("-"*20)
출력 결과는 다음과 같다. 원본을 수정해도 데이터 값이 바뀌지 않는 것을 볼 수 있다.
수정된 원본 데이터 :
[[-6. -4. -2. 0.]
[10. 12. 14. 16.]]
수정된 원본 데이터 타입 : float32
데이터 타입이 다른 np.asarray 데이터 :
[[-3 -2 -1 0]
[10 12 14 16]]
np.asarray 데이터 타입 : int32
--------------------
그래서 복사를 하기 위해선, 그냥 np.array를 사용해서 데이터를 복사하는 것이 좋을 것 같다.