나는 내 문제에 대한 해결책을 가지고 있지만 다른 것들을 시도 할 때 찾을 수있는 더 나은 해결책이 아니었다. 그것은 모두 배열로 비교하고 삽입하기위한 단일 유연한 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
의 점에 유의) 일을 만들 수
이상하게 오늘의 삽입 (값, 0, (1,2,3))도 잘 작동합니다. 오류를 재현하려고합니다 ... – coderforlife
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
비교 부분에 대해서는 튜플 (values [0]) == (0,0,0)을 사용하고 있습니다. 그래도 제안에 감사드립니다! – coderforlife