2013-04-25 2 views
0

numpy 배열의 하위 집합을 복사하려고합니다 (이미지 배경 빼기 작업을 수행하기 위해 - by by). 나는 다음과 같은 잘못을 이해하지 않는다 - 당신이 정말로 내 모든 코드를 통해 웨이드 싶지 않기 때문에 나는 대화를 입증했습니다 ... 내가 좋아하는 것 무엇Numpy 배열 하위 집합 - 예기치 않은 동작

>>> from numpy import zeros 
>>> a = zeros((5,5,3), 'uint8') 
>>> print a.shape 
(5, 5, 3) 
>>> b = a[1:2][1:2][:].copy() 
>>> print b.shape 
(0, 5, 3) 
>>> print a[1:2][1:2][:].shape 
(0, 5, 3) 
>>> print a.shape 
(5, 5, 3) 
>>> 

이 b.shape입니다 돌아 오는 (2,2,3) - 그와 같이해야 할 후속 작업에서 그런 식으로 행동하십시오. 나는 분명히 잘못된 것을 한 것이 틀림 없다고 확신하지만, 나는 무엇을 해결할 수 없다. 어떤 제안이라도 감사하게 받아 들였습니다!

+0

노아와 코스 모두에게 감사드립니다.나는 지금 당장 포기해야한다고 생각한다. 같은 모듈의 다른 곳에서도 올바른 인덱스 문법을 사용했다. – Dorsey

답변

3

나는 a[1:2][1:2][:] 대신 a[1:3, 1:3, :]을 의미한다고 생각합니다.

또한 a[1:3, 1:3, ...]도 작동합니다 (...은 "필요에 따라 많은 :"을 의미 함). NumPy는 a[1:3, 1:3]도 허용하는 것으로 보입니다.

설명을 두 부분이있다는 : 파이썬에서

  1. 슬라이스는 왼쪽 포함되어

  2. 쉼표 색인 여기에 필요한 마우스 오른쪽 독점, a[1:3] 당신에게 모양을 제공 (2,5,3) 다른 [1:3]은 첫 번째 차원을 다시 슬라이스합니다.

    간단한 인덱싱의 경우 각 연속 인덱싱이 하나의 차원을 제거하기 때문에 a[1,2,3]과 같습니다. 그것은 썰기를 위해 붙지는 않지만, 쉼표를 사용해야합니다.

3

두 가지 문제가 있습니다. 주된 방법은 numpy로 인덱싱을 처리하는 방법입니다. 때문에 실패 당신이 대신하고있는

>>> from numpy import zeros 
>>> a = zeros((5,5,3), 'uint8') 
>>> print a[1:2,1:2,:].shape 
(1, 1, 3) 

을 : NumPy와 매트릭스는 괄호 대신 별도의 인덱스의 쉼표를 사용하여 ... 당신이 사용하고 목록 구문의 목록보다 훨씬 더 분명 자신의 구문이 A [1 : 2] : 당신 같으면 (

>>> a[1:2] 
array([[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]]], dtype=uint8) 
>>> a[1:2][1:2] 
array([], shape=(0, 5, 3), dtype=uint8) 

여전히 당신의 다음 인덱스가 외부 목록에 인덱스 (하나 개의 요소가있는) 당신이 원하는 아닌 내부 목록입니다, 목록의 목록을 반환 슬라이스가 아닌 간단한 인덱스를 사용하는 경우이 문제가 발생하지만 훨씬 명확하므로 쉼표 구문을 사용해야합니다.

둘째, 슬라이스를 잘못 사용하고 있습니다. 슬라이스의 첫 번째 값은 원하는 배열의 첫 번째 값의 인덱스이며 인덱스는 0부터 시작합니다. 두 번째 값은 원하는 배열의 인덱스보다 하나 더 큽니다. 이것은 a[first_index:second_index]second_index-first_index 포인트를 반환하도록합니다.

>>> b = a[0:2,0:2,:] 
>>> b 
array([[[0, 0, 0], 
     [0, 0, 0]], 

     [[0, 0, 0], 
     [0, 0, 0]]], dtype=uint8) 

[1:2] 귀하의 인덱스는 하나 개의 요소를 반환합니다 ... 목록에서 두 번째 : 그래서, 당신은 이런 식으로 뭔가를 할 수 있습니다.

또한 부수적으로 numpy 배열에서 조각을 가져 오는 것이 이미 새 개체를 만들기 때문에 .copy()이 중복됩니다.