import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1 2 3 4 5 6 7 8 9]
print(y.ravel())
[1 2 3 4 5 6 7 8 9]
두 함수 모두 같은 목록을 반환합니다. 그런 다음 동일한 작업을 수행하는 두 가지 기능이 필요합니다.
답변
현재 API는 다음과 같습니다.
flatten
항상 사본을 반환합니다.ravel
가능할 때마다 원래 배열의 뷰를 반환합니다. 이것은 인쇄 된 결과물에는 보이지 않지만, ravel이 반환 한 배열을 수정하면 원래 배열의 항목이 수정 될 수 있습니다. flatten에서 반환 된 배열의 항목을 수정하면 이런 일이 발생하지 않습니다. 메모리가 복사되지 않으므로 ravel이 더 빠를 수 있지만 반환되는 배열을 수정하는 데 더주의해야합니다.reshape((-1,))
배열의 보폭이 항상 연속 배열을 얻지 못한다고해도 배열의 보폭이 허용 할 때마다 뷰를 얻습니다.
답변
여기 에 설명 된 주요 차이점은 다음과 같습니다.
-
flatten
은 ndarray 객체의 메서드이므로 실제 numpy 배열에 대해서만 호출 할 수 있습니다. -
ravel
는 라이브러리 수준 함수이므로 성공적으로 구문 분석 할 수있는 모든 개체에서 호출 할 수 있습니다.
예를 들어 ravel
ndarray 목록에서 작동하지만 flatten
해당 유형의 객체에는 사용할 수 없습니다.
@IanH는 또한 그의 대답에서 메모리 처리와 중요한 차이점을 지적합니다.
답변
함수에 대한 올바른 네임 스페이스는 다음과 같습니다.
두 함수 모두 새로운 메모리 구조를 가리키는 평평한 1D 배열을 반환합니다.
import numpy
a = numpy.array([[1,2],[3,4]])
r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)
print(id(a))
print(id(r))
print(id(f))
print(r)
print(f)
print("\nbase r:", r.base)
print("\nbase f:", f.base)
---returns---
140541099429760
140541099471056
140541099473216
[1 2 3 4]
[1 2 3 4]
base r: [[1 2]
[3 4]]
base f: None
위의 예에서 :
- 결과의 메모리 위치가 다릅니다.
- 결과는 동일하게 보입니다
- 납작 해지다
- 라벨은보기를 반환합니다.
어떤 것이 사본인지 어떻게 확인합니까? 의 .base
속성을 사용합니다 ndarray
. 뷰인 경우 기본은 원래 배열이됩니다. 사본 인 경우 기준은입니다 None
.