반응형
NumPy가 뷰 또는 복사본을 생성하는지 어떻게 알 수 있습니까?
최소한의 작업 예제를 위해 2D 배열을 디지털화하겠습니다. numpy.digitize
1D 배열이 필요합니다.
import numpy as np
N = 200
A = np.random.random((N, N))
X = np.linspace(0, 1, 20)
print np.digitize(A.ravel(), X).reshape((N, N))
... 필요한 경우에만 복사본이 만들어집니다.
이 경우 ravel
사본이 "필요한지" 어떻게 알 수 있습니까? 일반적으로 특정 작업이 복사본 또는보기를 생성하는지 확인할 수있는 방법이 있습니까?
이 질문은 내가 얼마 전에 물었던 질문 과 매우 유사합니다 .
base
속성을 확인할 수 있습니다 .
a = np.arange(50)
b = a.reshape((5, 10))
print (b.base is a)
그러나 그것은 완벽하지 않습니다. 을 사용하여 메모리를 공유하는지 확인할 수도 있습니다 np.may_share_memory
.
print (np.may_share_memory(a, b))
확인할 수있는 플래그 속성도 있습니다.
print (b.flags['OWNDATA']) #False -- apparently this is a view
e = np.ravel(b[:, 2])
print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object.
그러나이 마지막 것은 나에게 약간 수상한 것처럼 보이지만, 왜 그런지 손가락을 댈 수는 없지만 ...
reshape 문서 에는보기를 만들 수없는 경우 예외를 보장하는 방법에 대한 몇 가지 정보가 있습니다.
데이터를 복사하지 않고 배열의 모양을 항상 변경할 수있는 것은 아닙니다. 데이터를 복사 할 때 오류가 발생하도록하려면 배열의 모양 속성에 새 모양을 할당해야합니다.
>>> a = np.zeros((10, 2))
# A transpose make the array non-contiguous
>>> b = a.T
# Taking a view makes it possible to modify the shape without modiying the
# initial object.
>>> c = b.view()
>>> c.shape = (20)
AttributeError: incompatible shape for a non-contiguous array
이것은 귀하의 질문에 대한 정확한 답변은 아니지만 어떤 경우에는 유용 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/11524664/how-can-i-tell-if-numpy-creates-a-view-or-a-copy
반응형
'Nice programing' 카테고리의 다른 글
다른 스크립트를 사용하여 코드에서 후행 공백을 제거하는 방법은 무엇입니까? (0) | 2020.12.12 |
---|---|
git add -A는 디렉토리의 모든 수정 된 파일을 추가하지 않습니다. (0) | 2020.12.12 |
분수를 유지하면서 문자열을 소수로 변환 (0) | 2020.12.11 |
Jenkins에서 "gradle"프로그램을 실행할 수 없습니다. (0) | 2020.12.11 |
matplotlib를 사용하여 모든 서브 플롯의 기본 색상주기를 설정하는 방법은 무엇입니까? (0) | 2020.12.11 |