2012-11-28 29 views
2

numpy的多個切片布爾

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

foo[row_criteria, col_criteria, 0] += 5 
foo[row_criteria,:,0][:,col_criteria] += 5 

row_criteria和col_criteria是布爾陣列(1D)。在第一種情況下,我得到一個

「的形狀不匹配:對象不能被廣播到一個單一的形狀」錯誤

在第二種情況下,+ = 5沒有得到在所有應用。當我做

foo[row_criteria,:,0][:,col_criteria] + 5 

,我收到了修改返回值,但修改的地方的價值似乎並沒有工作...

有人能解釋如何解決這一問題?謝謝!

+1

foo是一維數組,爲什麼你想引用3個維度? –

+0

對不起,這是一個錯字 - 會快速更改爲3D陣列 – ejang

回答

2

你想:

foo[np.ix_(row_criteria, col_criteria, [0])] += 5 

要理解其工作原理藉此例如:

import numpy as np 
A = np.arange(25).reshape([5, 5]) 
print A[[0, 2, 4], [0, 2, 4]] 
# [0, 12, 24] 

# The above example gives the the elements A[0, 0], A[2, 2], A[4, 4] 
# But what if I want the "outer product?" ie for [[0, 2, 4], [1, 3]] i want 
# A[0, 1], A[0, 3], A[2, 1], A[2, 3], A[4, 1], A[4, 3] 
print A[np.ix_([0, 2, 4], [1, 3])] 
# [[ 1 3] 
# [11 13] 
# [21 23]] 

同樣的事情可與布爾索引。此外np.ix_不會做任何事情真的很神奇,它只是重塑它的參數,以便他們能相互進行廣播:

i, j = np.ix_([0, 2, 4], [1, 3]) 
print i.shape 
# (3, 1) 
print j.shape 
# (1, 2) 
+0

謝謝。但如何布爾數組不返回我期待的相同的看法? – ejang

+0

因爲您期待「外部產品」類型的視圖。當您談論布爾索引時,「外部產品」視圖可能是更有用的視圖,但numpy中的默認值是按照元素進行索引的。由於numpy支持多種類型的索引,並且廣播允許numpy使用'ix_'功能輕鬆支持「外部產品」索引,所以默認爲明智的索引似乎是合理的選擇。但是合理與否,numpy默認爲元素索引。 –