2013-06-05 5 views
3

나는 내 문제에 대한 해결책을 가지고 있지만 다른 것들을 시도 할 때 찾을 수있는 더 나은 해결책이 아니었다. 그것은 모두 배열로 비교하고 삽입하기위한 단일 유연한 dtype 값을 생성하는 것으로 귀결됩니다.유연한 dtype의 새로운 numpy 배열 - 스칼라 만들기

저는 RGB 24 비트 이미지 (각 R, G, B 비트 당 8 비트) 이미지 배열을 가지고 있습니다. 일부 작업의 경우 HxWx3을 사용하는 3D 배열로 사용하는 것이 가장 좋습니다. 그렇지 않으면 dtype ([('R', uint8), ('G', uint8)을 사용하여 구조화 된 배열로 사용하는 것이 가장 좋습니다. , ('B', uint8)]). 한 가지 예는 모든 고유 한 색상에 다른 값이 부여되도록 이미지 색상의 레이블을 다시 지정하려고 할 때입니다. 나는 다음과 같은 코드를 사용하여이 작업을 수행 :이 아름답게 작동

# Given im as an array of HxWx3, dtype=uint8 
from numpy import dtype, uint8, unique, insert, searchsorted 
rgb_dtype = dtype([('R',uint8),('G',uint8),('B',uint8)])) 
im = im.view(dtype=rgb_dtype).squeeze() # need squeeze to remove the third dim 
values = unique(im) 
if tuple(values[0]) != (0, 0, 0): 
    values = insert(values, 0, 0) # value 0 needs to always be (0, 0, 0) 
labels = searchsorted(values, im) 

그러나 나는 if 문을 만들려고하고하는 것은 더 좋은보고 만있는 방법을 찾을 수 없습니다. 그래서 먼저 비교 볼 수 있습니다 :

>>> values[0] 
(0, 0, 0) 
>>> values[0] == 0 
False 
>>> values[0] == (0, 0, 0) 
False 
>>> values[0] == array([0, 0, 0]) 
False 
>>> values[0] == array([uint8(0), uint8(0), uint8(0)]).view(dtype=rgb_dtype)[0] 
True 
>>> values[0] == zeros((), dtype=rgb_dtype) 
True 

그러나 당신이 찾고 말도하지 않았다 (0, 0, 0) 또는 (1, 1, 1) 뭔가 이외의 무언가를 원한다면? rgb_dtype.create((0,0,0))처럼 쉽게 구성 할 수있는 것처럼 보입니다.

다음으로 insert 문을 사용하면 (0, 0, 0)에 0을 입력해야합니다. 다른 값들에 대해서는 실제로 작동하지 않습니다. 예를 들어 (1, 2, 3)을 삽입하면 실제로는 (1, 1, 1), (2, 2, 2), (3, 3, 3)이 삽입됩니다.

결국 결국 더 좋은 방법이 있습니까? 감사!

나는 당신의 사건에 대한 insert() 작업 (이 [0]을 사용하는 대신 0의 점에 유의) 일을 만들 수

답변

1

:

values = insert(values, [0], (1,2,3)) 

(예를 들어) 제공 :

array([(0, 1, 3), (0, 0, 0), (0, 0, 4), ..., (255, 255, 251), (255, 255, 253), (255, 255, 255)], 
     dtype=[('R', 'u1'), ('G', 'u1'), ('B', 'u1')]) 

할 수있는 또 다른 방법에 대해서 당신의 if, 당신은이 작업을 수행 할 수 있습니다

str(values[0]) == str((0,0,0)) 
,691,363 (210)

또는, 어쩌면 더 강력한 :

eval(str(values[0])) == eval(str(0,0,0)) 
+1

이상하게 오늘의 삽입 (값, 0, (1,2,3))도 잘 작동합니다. 오류를 재현하려고합니다 ... – coderforlife

+0

NumPy v1.7.0 이하에서는 insert (값, 0, (1,2,3))가 작동하지만 NumPy v1.7.1부터는 [0]을 수행해야합니다. 대신 여기에 제안 된 것처럼. NumPy v1.8.0 문서부터는이 새로운 기능이 언급되었습니다 (v1.8.0의 새로운 내용이지만 v1.7.1에서 실제로 소개 된 것을 볼 수 있습니다). 그리고 0과 [0]의 차이점에 대해 특별히주의해야합니다. 감사! – coderforlife

+1

비교 부분에 대해서는 튜플 (values ​​[0]) == (0,0,0)을 사용하고 있습니다. 그래도 제안에 감사드립니다! – coderforlife