删除元素并将其插入到 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
),然后你填充掩码为 False
(data!=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])
假设我有一个 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
),然后你填充掩码为 False
(data!=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])