NumPy에서 np.array()와 np.asarray()의 차이점
NumPy에서 np.array()와 np.asarray()의 차이점
복사 vs. 뷰
np.array()
: 기본적으로 입력 데이터의 복사본을 만들어 새로운 NumPy 배열을 생성합니다. 즉, 원본 데이터와 별도의 메모리 공간에 새로운 배열이 저장됩니다.np.asarray()
: 가능한 경우 입력 데이터의 뷰(view)를 반환합니다. 뷰는 원본 데이터를 참조하는 다른 배열입니다. 즉, 새로운 배열이 생성되지 않고 기존 데이터에 대한 다른 시각을 제공합니다. 입력 데이터가 이미 NumPy 배열인 경우np.asarray()
는 해당 배열을 그대로 반환합니다.
데이터 유형 변환
np.array()
:dtype
매개변수를 사용하여 입력 데이터의 데이터 유형을 변환할 수 있습니다. 원본 데이터의 유형과 다르면 새로운 배열이 생성됩니다.np.asarray()
: 데이터 유형 변환을 수행하지 않습니다. 입력 데이터의 유형을 그대로 유지합니다.
성능
np.array()
: 일반적으로np.asarray()
보다 느립니다. 왜냐하면 항상 새로운 배열을 만들기 때문입니다.np.asarray()
: 더 빠르게 작동합니다. 특히 입력 데이터가 이미 NumPy 배열인 경우 성능 향상이 두드러집니다.
메모리 사용
np.array()
: 더 많은 메모리를 사용합니다. 왜냐하면 새로운 배열을 만들기 때문입니다.np.asarray()
: 메모리 사용량이 적습니다. 기존 데이터를 참조하기 때문에 새로운 배열을 만들지 않습니다.
사용 시나리오
- 새로운 NumPy 배열을 만들고 데이터 유형을 변환해야 하는 경우
np.array()
를 사용하십시오. - 성능과 메모리 사용이 중요한 경우
np.asarray()
를 사용하는 것이 좋습니다.
예시
import numpy as np
# 리스트를 NumPy 배열로 변환
data = [1, 2, 3]
arr1 = np.array(data) # 새로운 배열 생성
arr2 = np.asarray(data) # 뷰 생성 (입력 데이터가 NumPy 배열이 아닌 경우)
print(arr1) # 출력: [1 2 3]
print(arr2) # 출력: [1 2 3]
# NumPy 배열을 변환
arr = np.arange(5)
new_arr1 = np.array(arr, dtype=float) # 데이터 유형 변환
new_arr2 = np.asarray(arr) # 데이터 유형 변환 안 됨
print(new_arr1) # 출력: [0. 1. 2. 3. 4.]
print(new_arr2) # 출력: [0 1 2 3 4]
NumPy에서 np.array()와 np.asarray() 비교 예제 코드
import numpy as np
# 리스트를 NumPy 배열로 변환
data = [1, 2, 3]
# np.array() 사용
arr1 = np.array(data)
print(f"np.array(data): {arr1}") # 출력: np.array(data): [1 2 3]
# np.asarray() 사용
arr2 = np.asarray(data)
print(f"np.asarray(data): {arr2}") # 출력: np.asarray(data): [1 2 3]
# id 확인: 동일한 배열을 참조하는지 확인
print(f"np.array(data) id: {id(arr1)}")
print(f"np.asarray(data) id: {id(arr2)}") # 출력: np.array(data) id: 1403640488
# np.asarray(data) id: 1403640488
# 원본 데이터 변경
data[0] = 10
# 변경 확인
print(f"data: {data}") # 출력: data: [10 2 3]
print(f"np.array(data): {arr1}") # 출력: np.array(data): [10 2 3]
print(f"np.asarray(data): {arr2}") # 출력: np.asarray(data): [10 2 3]
# NumPy 배열 변환
arr = np.arange(5)
# np.array() 사용, 데이터 유형 변환
new_arr1 = np.array(arr, dtype=float)
print(f"np.array(arr, dtype=float): {new_arr1}") # 출력: np.array(arr, dtype=float): [0. 1. 2. 3. 4.]
# np.asarray() 사용, 데이터 유형 변환 안 됨
new_arr2 = np.asarray(arr)
print(f"np.asarray(arr): {new_arr2}") # 출력: np.asarray(arr): [0 1 2 3 4]
설명:
data
리스트를 만들고np.array()
와np.asarray()
를 사용하여 NumPy 배열로 변환합니다.id()
함수를 사용하여 각 배열의 메모리 주소를 확인합니다.np.array()
로 생성된 배열과np.asarray()
로 생성된 배열은 동일한 메모리 위치를 참조한다는 것을 확인할 수 있습니다. 즉,np.asarray()
는 원본 데이터의 뷰를 반환합니다.data
리스트의 첫 번째 요소를 변경하고 각 배열의 값을 다시 출력합니다. 모든 배열에서 값이 변경되었음을 확인할 수 있습니다. 이는np.array()
와np.asarray()
가 모두 원본 데이터를 참조하기 때문입니다.np.arange(5)
를 사용하여 NumPy 배열을 만듭니다.np.array()
를 사용하여 데이터 유형을float
로 변환합니다. 새로운 배열new_arr1
은 데이터 유형이 변경되었음을 확인할 수 있습니다.
결론:
np.array()
는 항상 새로운 배열을 만들고 원하는 경우 데이터 유형을 변환할 수 있습니다.np.asarray()
는 가능한 경우 기존 데이터의 뷰를 반환하여 성능과 메모리 사용량을 향상시킵니다.
np.fromlist()
: 1차원 배열을 만드는 데 유용합니다.
data = [1, 2, 3]
arr = np.fromlist(data)
print(arr) # 출력: [1 2 3]
np.fromiter()
: 반복 가능한 객체에서 배열을 만드는 데 유용합니다.
data = iter([1, 2, 3])
arr = np.fromiter(data)
print(arr) # 출력: [1 2 3]
np.ones()
: 특정 값으로 채워진 배열을 만드는 데 유용합니다.
arr = np.ones(5)
print(arr) # 출력: [1. 1. 1. 1. 1.]
arr = np.zeros(5)
print(arr) # 출력: [0. 0. 0. 0. 0.]
np.full()
: 특정 값으로 채워진 배열을 만드는 데 유용합니다.np.ones()
와 유사하지만 모든 요소에 동일한 값을 지정할 수 있습니다.
arr = np.full(5, 10)
print(arr) # 출력: [10. 10. 10. 10. 10.]
np.arange()
: 등차수열을 만드는 데 유용합니다.
arr = np.arange(5)
print(arr) # 출력: [0 1 2 3 4]
np.linspace()
: 선형 간격으로 값을 가진 배열을 만드는 데 유용합니다.
arr = np.linspace(0, 10, 5)
print(arr) # 출력: [ 0. 2. 4. 6. 8. 10.]
위에서 언급한 방법 외에도 NumPy에는 다양한 배열 생성 함수가 있습니다. 특정 상황에 가장 적합한 함수를 선택하는 것이 중요합니다.
참고:
np.fromlist()
와np.fromiter()
는 1차원 배열만 만들 수 있습니다. 다차원 배열을 만들려면np.array()
또는np.asarray()
를 사용해야 합니다.np.ones()
,np.zeros()
,np.full()
,np.arange()
,np.linspace()
은 기본적으로 float64 데이터 유형을 사용합니다. 다른 데이터 유형을 원하는 경우dtype
매개변수를 사용하여 지정할 수 있습니다.
python arrays numpy