2016-09-27 45 views
2

我有一個numpy布爾二維數組,表示一個灰度圖像,它基本上是一個空白形狀(三角形,正方形,圓形),由白色像素組成True,黑色像素爲False。我想通過將白色像素修改爲黑色像素來添加黑色填充。在列和行的範圍內的Numpy數組操作

array([[True, True, True, False, False, False, False, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, False, False, False, False, True, True, True]]) 

(這9個True在這陣中間的平方值應該成爲False

是否有一個numpy的切片方法,這將使這個簡單/快嗎?有什麼我可以隨時修改所有True s False,然後是True,直到False的下一個實例?

+0

沿行可能有多個對象嗎? – Divakar

+0

只是一個對象。 – Gmo

回答

0

根據你的邏輯,你可以用假替換第一個假和假最後之間的所有值:

def mutate(A): 
    ind = np.where(~A)[0] 
    if len(ind) != 0: 
     A[ind.min():ind.max()] = False 
    return A 


np.apply_along_axis(mutate, 1, arr) 

# array([[ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True]], dtype=bool) 
1

在這裏,人們的想法,很容易實現,而且相當快速地執行。

我會使用0和1,因此看起來更清晰一些。

這裏的起始數組:

使用 np.logical_and.accumulate,翻轉左到右,再次做同樣的,翻轉後,左到右
>>> a 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]]) 

厚積薄發和「或」兩列在一起:

>>> andacc = np.logical_and.accumulate 
>>> (andacc(a, axis=1) | andacc(a[:, ::-1], axis=1)[:, ::-1]).astype(int) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]]) 

(漏下.astype(int)保持布爾數組,而不是0和1)。

這裏有一個三角形:

>>> b 
array([[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1], 
     [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1], 
     [1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1], 
     [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]]) 

>>> (andacc(b, axis=1) | andacc(b[:, ::-1], axis=1)[:, ::-1]).astype(int) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1], 
     [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])