[英]Convert all zeros to ones which are between ones in numpy array
考慮一個numpy數組
arr = numpy.array([[1,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1],
[1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1],
[0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]])
我想將所有零轉換為1
輸出應該是
[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]]
我該如何實現? 是否有任何numpy函數來實現?
這是使用np.maximum.accumulate
的一種方法,將其用於列翻轉版本,如果沒有,僅獲取它們的交集-
def fill_gaps(arr):
ma = np.maximum.accumulate
return ma(arr[:,::-1],axis=1)[:,::-1] & ma(arr,axis=1)
樣品運行-
# Sample #1
In [27]: print arr
[[1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1]
[1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
[0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]]
In [28]: print fill_gaps(arr)
[[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]]
# Sample #2
In [42]: print arr
[[1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1]
[0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0]
[0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]]
In [43]: print fill_gaps(arr)
[[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0]
[0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]]
為了用0s
和其他值(例如255s
填充數組,這是一個修改-
def fill_gaps(arr, value=1):
ma = np.maximum.accumulate
mask = arr==value
mask_filled = ma(mask[:,::-1],axis=1)[:,::-1] & ma(mask,axis=1)
return np.where(mask_filled,value,0)
樣品運行-
In [69]: print arr
[[255 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0
0 255 0 0 255 255 255 255 255 255 255 255]
[ 0 0 0 255 0 255 0 255 0 255 0 255 0 255 0 255 0 255
0 255 0 255 0 255 0 255 0 255 0 0]
[ 0 0 0 0 0 255 0 255 255 255 255 255 0 0 0 255 255 255
0 0 0 0 0 0 0 0 0 0 0 0]]
In [70]: print fill_gaps(arr, 255)
[[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255]
[ 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 0 0]
[ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255
0 0 0 0 0 0 0 0 0 0 0 0]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.