[python] Numpy에서 Flatten과 Ravel 함수의 차이점은 무엇입니까?

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 는 라이브러리 수준 함수이므로 성공적으로 구문 분석 할 수있는 모든 개체에서 호출 할 수 있습니다.

예를 들어 ravelndarray 목록에서 작동하지만 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.


답변