删除元素并将其插入到 Numpy 数组中的指定索引

Remove and insert element to a specified indices in Numpy array

假设我有一个 numpy 数组,我想从中删除一个特定元素。

# data = np.array([ 97  32  98  32  99  32 100  32 101])
# collect indices where the element locate 
indices = np.where(data==32)
without_32 = np.delete(data, indices)
# without_32 become [ 97  98  99 100 101]

现在,假设我想恢复数组(因为我已经有了应该放置值 32 的索引)。

restore_data = np.insert(without_32, indices[0], 32)

但它给出了 IndexError: index 10 is out of bounds for axis 0 with size 9。还有其他实现方式吗?

更新

似乎删除元素后我需要对索引进行一些调整,例如

restore_data = np.insert(without_32, indices[0]-np.arange(len(indices[0])), 32)

但是我可以概括一下吗?不仅喜欢32,还喜欢追踪33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47。我的意思是我想以一种有效的方式追踪 32-47 的相同方式。

我的选择:

#define a mask 
mask = data==32
mask #array([False,  True, False,  True, False,  True, False,  True, False])

#filter
without_32 = data[~mask]
without_32 #array([ 97,  98,  99, 100, 101])

那么如果你想要原始数据:

restore_data = np.ones_like(mask, dtype=int)*32
restore_data[~mask] = without_32
restore_data

输出:

array([ 97,  32,  98,  32,  99,  32, 100,  32, 101])

在实践中,你正在生成一个 32 的常量数组,长度等于 mask(显然等于 data),然后你填充掩码为 Falsedata!=32的位置)与without_32数组

更新

为了回答您的更新:

data = np.random.randint(20, 60, size=20)
#array([47, 39, 29, 45, 21, 44, 48, 27, 21, 25, 47, 59, 58, 53, 46, 36, 34, 57, 36, 54])

mask = (data>=32)&(data<=47) #the values you want to remove

clean_array = data[~mask] #data you want to retain
removed_data = data[mask] #data you want to remove

现在你可以 del data,你可以用 clean_array 做任何你想做的事,当你需要重建原始数组时,你只需:

restore_data = np.zeros_like(mask, dtype=int)
restore_data[~mask] = clean_array
restore_data[mask] = removed_data
#array([47, 39, 29, 45, 21, 44, 48, 27, 21, 25, 47, 59, 58, 53, 46, 36, 34, 57, 36, 54])