2017-10-17 3 views
1
a=b=np.arange(9).reshape(3,3) 
i=np.arange(3) 
mask=a<i[:,None,None]+3 

지금벡터화 : 배열에 대한 너무 많은 인덱스

b[np.where(mask[0])] 
>>>array([0, 1, 2]) 

b[np.where(mask[1])] 
>>>array([0, 1, 2, 3]) 

b[np.where(mask[2])] 
>>>array([0, 1, 2, 3, 4]) 

내가 벡터화와 함께 그들 모두를 인쇄 싶어, 나는

b[np.where(mask[i])] 모두 그들의 b[np.where(mask[i[:,None,None]])]

쇼를보십시오 IndexError: too many indices for array

+0

나는 이것이 당신이 원하는 것을 전혀하지 않습니다. 특히 배열의 진리 값이 취해지기 때문에'np.where (mask [0]) [0]'은 모두'True'이고 (적어도 하나의 요소가 참이면'True'가됩니다), 또한 여러분은 'np.where()'의 두 반환 값을 사용하여, 나는 당신이 원하는 것이라고 생각하지 않는다. – remram

답변

0

벡터를 인쇄하려면 x, y 및 z 차원에만 존재할 수 있습니다. mask이 (3,3,3-) 동안 당신은 4

+1

3 차원 이상의 벡터를 본 적이 있습니까? –

1
In [165]: a 
Out[165]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
In [166]: mask 
Out[166]: 
array([[[ True, True, True], 
     [False, False, False], 
     [False, False, False]], 

     [[ True, True, True], 
     [ True, False, False], 
     [False, False, False]], 

     [[ True, True, True], 
     [ True, True, False], 
     [False, False, False]]], dtype=bool) 

그래서 a (및 b)는 (3,3)입니다 있습니다.

배열인가 부울 마스크는 1D (where 통해인가 될 때와 동일)이 생성

In [170]: a[mask[1,:,:]] 
Out[170]: array([0, 1, 2, 3]) 
차원 마스크

where는 2 소자 터플 생성을 할 수있는 인덱스를 2 차원 배열 :

차원 마스크
In [173]: np.where(mask[1,:,:]) 
Out[173]: (array([0, 0, 0, 1], dtype=int32), array([0, 1, 2, 0], dtype=int32)) 

where 는 3 원소 튜플 - 따라서 too many indices 에러 :

In [174]: np.where(mask) 
Out[174]: 
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2], dtype=int32), 
array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1], dtype=int32), 
array([0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 1], dtype=int32)) 

는 이제

In [176]: np.tile(a[None,:],(3,1,1)).shape 
Out[176]: (3, 3, 3) 
In [177]: np.tile(a[None,:],(3,1,1))[mask] 
Out[177]: array([0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4]) 

값이있는 마스크를 3D 및 적용 a을 확대 해 봅시다,하지만 그들은 결합됩니다.

우리는 mask의 각면에 True의 수를 계산하고, split에 마스크 된 타일이를 사용할 수 있습니다

In [185]: mask.sum(axis=(1,2)) 
Out[185]: array([3, 4, 5]) 
In [186]: cnt=np.cumsum(mask.sum(axis=(1,2))) 
In [187]: cnt 
Out[187]: array([ 3, 7, 12], dtype=int32) 

In [189]: np.split(np.tile(a[None,:],(3,1,1))[mask], cnt[:-1]) 
Out[189]: [array([0, 1, 2]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4])] 

는 내부적으로 np.split 파이썬 수준의 반복을 사용합니다. 그래서 mask 비행기의 반복은 (이 작은 예에서는 6 배 빨라지는 것처럼) 좋을 수도 있습니다. 원하는 '벡터화'개별 어레이 (3)이고, (4) 및 (5) 형상의 근본적인 문제를 가리키는

In [190]: [a[m] for m in mask] 
Out[190]: [array([0, 1, 2]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4])] 

. 크기 배열이 다르면 실제로 '벡터화'가 불가능하지는 않더라도 어렵다는 강력한 지표입니다.