我有一個串列串列,每個串列都表示一個數字間隔:
intervals = [[1, 4],
[7, 9],
[13, 18]
]
我需要創建一個包含 20 個元素的串列,如果每個元素的索引不包含在任何間隔中,則每個元素為 0,否則為 1。因此,所需的輸出是:
output = [0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0]
我可以想到使用一些簡單的東西,如下所示:
output = zeros(20)
for index, _ in enumerate(output):
for interval in intervals:
if interval[0] <= index <= interval[1]:
output[index] = 1
但是有沒有更有效的方法?
uj5u.com熱心網友回復:
與@mozway 的答案基本相同,但沒有創建中間資料結構并且可以說更具可讀性:
output = np.zeros(N, dtype=int)
for start, end in intervals:
output[np.arange(start, end 1)] = 1
uj5u.com熱心網友回復:
您可以使用高級索引:
a = np.zeros(20, dtype=int)
idx = np.hstack([np.r_[a:b 1] for a,b in intervals])
# array([ 1, 2, 3, 4, 7, 8, 9, 13, 14, 15, 16, 17, 18])
a[idx] = 1
輸出:
array([0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0])
uj5u.com熱心網友回復:
可能有一種更有效的方法來做到這一點,但這可能會讓你開始:
intervals = np.array([[1, 4], [7, 9], [13, 18]])
low, high = intervals[:,0], intervals[:,1]
r = np.arange(20)[:,None]
((low <= r) & (high >= r)).any(1).astype(int)
輸出:
array([0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441564.html
