Python:从 numpy 索引数组中提取特定值
Python: extracting specific values out an numpy array of indices
我有一个 numpy 索引数组。例如:
indices = np.array([0, 1, 2, 6, 7, 9, 12, 13, 14])
我想做一个数组
signals = np.zeros(np.amax(indices) + 1)
我将值 2.0 作为以下形式的序列的起始索引:0、1、2、3 或 8、9、10、11(因此值增加 1)和最后一个元素这个序列是 3.0.
如果序列只有一个数字长(因此没有序列),我会将值 4.0 放入此数组中。
因此对于上面给出的示例,输出应该是 [2.0, 0, 3.0, 0, 0, 0, 2.0, 3.0, 0, 4.0, 0, 0, 2.0, 0, 3.0]
.
这种问题,一般np.diff
就可以解决。我们需要找到每个序列的开始和结束索引;此外,不在任何序列中的值的索引将从找到的索引中删除。最后,signals
将在指定的 indices
中填充指定的值:
# append is used for considering the last element
diff1 = np.diff(indices, prepend=indices[0]-2, append=indices[-1]+2) # [2 1 1 4 1 2 3 1 1 2]
mask_start = diff1 != 1 # [ True False False True False True True False False True]
end = np.where(mask_start)[0] - 1 # [-1 2 4 5 8]
# correcting start mask for where a value is not in a sequence
mask4 = np.diff(end, prepend=end[0]-2) == 1
mask4_ind = end[mask4]
mask_start[mask4_ind] = False # [ True False False True False False True False False True]
# modifying the zero array
signals_copy = signals[indices]
signals_copy[mask_start[:-1]] = 2.0
signals_copy[end[1:]] = 3.0
signals_copy[mask4_ind] = 4.0
signals[indices] = signals_copy
此代码适用于您的示例,并在其他示例中进行了测试。如果您遇到任何可能的缺点,您可以修复此代码。
我有一个 numpy 索引数组。例如:
indices = np.array([0, 1, 2, 6, 7, 9, 12, 13, 14])
我想做一个数组
signals = np.zeros(np.amax(indices) + 1)
我将值 2.0 作为以下形式的序列的起始索引:0、1、2、3 或 8、9、10、11(因此值增加 1)和最后一个元素这个序列是 3.0.
如果序列只有一个数字长(因此没有序列),我会将值 4.0 放入此数组中。
因此对于上面给出的示例,输出应该是 [2.0, 0, 3.0, 0, 0, 0, 2.0, 3.0, 0, 4.0, 0, 0, 2.0, 0, 3.0]
.
这种问题,一般np.diff
就可以解决。我们需要找到每个序列的开始和结束索引;此外,不在任何序列中的值的索引将从找到的索引中删除。最后,signals
将在指定的 indices
中填充指定的值:
# append is used for considering the last element
diff1 = np.diff(indices, prepend=indices[0]-2, append=indices[-1]+2) # [2 1 1 4 1 2 3 1 1 2]
mask_start = diff1 != 1 # [ True False False True False True True False False True]
end = np.where(mask_start)[0] - 1 # [-1 2 4 5 8]
# correcting start mask for where a value is not in a sequence
mask4 = np.diff(end, prepend=end[0]-2) == 1
mask4_ind = end[mask4]
mask_start[mask4_ind] = False # [ True False False True False False True False False True]
# modifying the zero array
signals_copy = signals[indices]
signals_copy[mask_start[:-1]] = 2.0
signals_copy[end[1:]] = 3.0
signals_copy[mask4_ind] = 4.0
signals[indices] = signals_copy
此代码适用于您的示例,并在其他示例中进行了测试。如果您遇到任何可能的缺点,您可以修复此代码。