문제가 있습니다. 문제는 : numpy 배열의 하위 클래스를 만들고 해당 유형의 객체 배열을 만들고 싶습니다. 해당 배열의 항목을 참조 할 때 여전히 그 하위 클래스의 인스턴스가되고 싶습니다. 대신, 그것은 numpy 배열의 인스턴스입니다.numpy의 하위 클래스 배열
import numpy as np
class ImageWrapper(np.ndarray):
def __new__(cls, image_data):
assert image_data.ndim in (2, 3)
return image_data.view(cls)
@property
def n_colours(self):
return 1 if self.ndim==2 else self.shape[2]
n_frames = 10
frames = [ImageWrapper(np.random.randint(255, size = (20, 15, 3)).astype('uint8')) for _ in xrange(n_frames)]
video = np.array(frames)
assert video[0].n_colours == 3
나에게 제공합니다 : AttributeError를 'numpy.ndarray'개체가 어떤 속성 'n_colours'가
가 어떻게이 작품을 만들 수 있습니다
가 여기에 실패 테스트입니다?상황이 이미 시도 :
- 설정 subok = 비디오를 구성 할 때 진정한 -이 단지 작품 서브 클래스 객체의 단일 인스턴스가 아닌 목록에서 배열을 구성.
- 설정 DTYPE = 개체 또는 DTYPE = ImageWrapper 내가 그냥 비디오 목록을 만들 수 있음을 인식
작동하지 않지만, 다른 이유로 NumPy와 배열로 유지하는 것이 바람직 할 것이다.
문제는, 당신이 4D 배열을 얻을 당신이 호출 할 때'3D 배열의 목록에 array' 것이 아니라 1D 배열 가득 3D 어레이의 분명히 4D 배열은'ImageWrapper '가 될 수 없으므로'ndarray'이기 때문에 데이터의 원래 위치와 상관없이 모든 슬라이스가'ndarray'입니다. 질문은 배열을 원하지만? 1D 배열의'object'는 네이티브리스트보다 numpy의 이점을 잃지 않지만, 그것의 _lot_을 잃습니다. 그리고 마지막 문장에서 "다른 이유"를 말할 수 있다면 도움이 될 것입니다. – abarnert
또한, 4D 배열이 'ImageWrapper'가 될 수 없다는 것을 디자인에서 결정해야하는 이유가 무엇입니까? N_3이면 (아니면 예외를 발생시키는 경우) 'n_colours'는 스칼라가 아닌 N-3 차원의 배열을 반환해야하지만 그렇지 않으면 무엇이 문제가됩니까? 그게 훨씬 더 간단해질 것이기 때문에 ... – abarnert
"다른 이유"는 큰 이유가 아니며, 이것은 배열이 예상되는 데이터 유형 인 인터페이스의 일부라는 것입니다. 이 경우 Jaime에서 제안한대로 개체 배열이 수행됩니다. – Peter