2012-11-28 4 views
1

이하는 my other question까지 따라 NumPy와 여러 슬라이스 부울

import numpy as np 
foo = np.ones(10,10,2) 

foo[np.ix_(row_boolean,col_boolean,[1])] += bar[np.ix_(col_boolean)] 

바의 후속 인 1 차원 배열과 row_boolean 및 col_boolean는 1D 부울 배열입니다. 나는 1D 바 배열의 특정 숫자를 foo의 해당 열에 적용하고 싶었습니다. 모든 행에 대해 == True는 row_boolean입니다.

내가하려고

위 (boolean_arr이되도록 모든 거짓), 나는 다음과 같은 오류 얻을 :

*** ValueError: non-broadcastable output operand with shape (0,0,1) doesn't match the broadcast shape (0,0,0)

가 어떻게 위의 수정합니까를? 비슷한 모양입니다

foo[np.ix_(row_boolean,col_boolean,[1])].shape == (0,0,1) 
bar[np.ix_(boolean_arr)].shape == (0,) 

감사합니다.

편집 :이 효과에 뭔가, 나는 이유를 설명 할 시간이 없어

In [46]: foo = np.random.random([5,5]) 

In [47]: foo 
Out[47]: 
array([[ 0.02736112, 0.71269725, 0.73994453, 0.21814789, 0.19557647], 
     [ 0.82418806, 0.94340516, 0.51143188, 0.51030109, 0.30127457], 
     [ 0.6996424 , 0.44577645, 0.24166962, 0.49316502, 0.3283645 ], 
     [ 0.94403 , 0.64943989, 0.51634012, 0.78914121, 0.73034792], 
     [ 0.16748087, 0.64182321, 0.50958472, 0.67246253, 0.17233392]]) 

In [48]: bar = np.array([1,2,3,4,5]) 

In [49]: col_filter = bar > 2 

In [50]: col_filter 
Out[50]: array([False, False, True, True, True], dtype=bool) 

In [51]: row_filter = foo[:,1] > .5 

In [52]: row_filter 
Out[52]: array([ True, True, False, True, True], dtype=bool) 

In [53]: foo[np.ix_(row_filter,col_filter)] 
Out[53]: 
array([[ 0.73994453, 0.21814789, 0.19557647], 
     [ 0.51143188, 0.51030109, 0.30127457], 
     [ 0.51634012, 0.78914121, 0.73034792], 
     [ 0.50958472, 0.67246253, 0.17233392]]) 

In [54]: foo[np.ix_(row_filter,col_filter)] += bar[np.ix_(col_filter)] 

In [55]: foo 
Out[55]: 
array([[ 0.02736112, 0.71269725, 3.73994453, 4.21814789, 5.19557647], 
     [ 0.82418806, 0.94340516, 3.51143188, 4.51030109, 5.30127457], 
     [ 0.6996424 , 0.44577645, 0.24166962, 0.49316502, 0.3283645 ], 
     [ 0.94403 , 0.64943989, 3.51634012, 4.78914121, 5.73034792], 
     [ 0.16748087, 0.64182321, 3.50958472, 4.67246253, 5.17233392]]) 
+0

나는 당신이하고 싶은 것을 더 잘 설명 할 필요가 있다고 생각한다.'foo [np.ix_ (row_boolean, col_boolean, [1]) ] + = X''X'는 scaler이거나 shape (1,)이어야합니다. 'bar [np.ix_ (boolean_arr)]'이 shape (3,)을 가질 때 당신은 무엇을 기대합니까? –

답변

1

여분의 세 번째 차원을 가지고 있지만, 당신은 당신이 읽을 수

foo[np.ix_(row_boolean, col_boolean) + (1,)] += bar[col_boolean] 

원하는 것만 당신이 알고 싶은 것보다 더 많이 advanced indexing here.