簡體   English   中英

在numpy數組中將所有零轉換為介於1之間的零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM