給定一個masknumpy 陣列,例如:
mask = np.array([0, 0, 1, 0, 0, 0, 1, ...])
我想1用一個target vector替換每個。例子:
target = np.array([5, 4, 3, 2, 1])
mask = np.array([0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,...])
output = np.array([0, 0, 5, 4, 3, 2, 1, 0, 5, 4, 3, 2, ...])
# Overlaps:
mask = np.array([0, 0, 1, 0, 0, 0, 1, 0, 0, 0,...])
output = np.array([0, 0, 5, 4, 3, 2, 5, 4, 3, 2, ...])
天真地,可以通過以下方式撰寫此內容(忽略邊界問題):
output = np.zeros_like(mask)
for i, x in enumerate(mask):
if x == 1:
output[i:i len(target)] = target
我想知道,這是否可能不求助于 for 回圈?
uj5u.com熱心網友回復:
不是完整的答案,但有一些想法:for 回圈是 O(n),其中n = len(mask). 我們可以np.split將其簡化為 O(k),其中k = number of 1s in mask:
def set_target(mask, target):
output = []
i, = np.where(mask == 1)
for split in np.split(mask, i):
if len(split) > len(target):
split[:len(target)] = target
output.append(split)
else:
output.append(target[:len(split)])
return np.concatenate(output, 0)
uj5u.com熱心網友回復:
numpy 支持一次性為同一索引多次賦值,如下所示:
mask = np.array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0])
padding_idx = [2,3,4,5,6,5,6,7,8,9,8,9,10,11]
padding_values = [5,4,3,2,1,5,4,3,2,1,5,4,3,2]
mask[padding_idx] = padding_values
>>> mask
array([0, 0, 5, 4, 3, 5, 4, 3, 5, 4, 3, 2])
你只需要找出padding_idx和padding_values。
請注意,padding_values = [5,4,3,2,1,5,4,3,2,1,5,4,3,2]缺少一個值。所以你還需要找到一些缺失的值。之后你可以使用broadcasting
vector = np.array([5,4,3,2,1])
N = len(vector)
mask = np.array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0])
idx = np.flatnonzero(mask)
missing_values = len(mask) - idx[-1] - N
#Broadcast
padding_idx = np.flatnonzero(mask)[:,None] np.arange(N)
padding_values = np.repeat(vector[np.newaxis, :], len(idx), axis=0)
#Flatten
padding_idx = padding_idx.ravel()[:missing_values]
padding_values = padding_values.ravel()[:missing_values]
#Go!
mask[padding_idx] = padding_values
>>> mask
array([0, 0, 5, 4, 3, 5, 4, 3, 5, 4, 3, 2])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/361507.html
上一篇:具有一組增量的不規則數字串列示例
