Nice programing

NumPy가 뷰 또는 복사본을 생성하는지 어떻게 알 수 있습니까?

nicepro 2020. 12. 12. 12:25
반응형

NumPy가 뷰 또는 복사본을 생성하는지 어떻게 알 수 있습니까?


최소한의 작업 예제를 위해 2D 배열을 디지털화하겠습니다. numpy.digitize1D 배열이 필요합니다.

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

반응형