如何从numpy二维数组中批量删除指定索引的元素?
如何根据索引从NumPy二维数组中删除指定元素?
嘿,我懂你碰到的问题了——直接用np.delete(a, idxs)确实达不到预期效果,因为NumPy的delete函数默认会把二维数组展平成一维来处理索引,而你传入的是(行,列)形式的二维坐标,自然会出错。咱们来一步步解决这个问题!
首先先明确你的需求:给定一个4行5列的数组,要删除[(0,1), (1,3), (2,1), (3,4)]这四个位置的元素,最终得到每行4个元素的数组。
方法一:逐行处理(直观易懂)
因为你的需求是每行恰好删除一个元素,我们可以拆分索引的行和列,然后逐行调用np.delete删除对应列的元素:
import numpy as np # 你的输入数组 a = np.array([[0.15393912, 0.08129568, 0.34958515, 0.21266128, 0.92372852], [0.42450441, 0.1027468 , 0.13050591, 0.60279229, 0.41168151], [0.06330729, 0.60704682, 0.5340644 , 0.47580567, 0.42528617], [0.27122323, 0.42713967, 0.94541073, 0.21462462, 0.07293321]]) idxs = [(0,1), (1,3), (2, 1), (3,4)] # 把索引拆成行和列的列表 rows, cols = zip(*idxs) # 逐行删除对应列,再组合成新数组 result = np.array([np.delete(row, col) for row, col in zip(a, cols)]) print(result)
运行这段代码后,你就能得到期望的结果:
[[0.15393912 0.34958515 0.21266128 0.92372852] [0.42450441 0.1027468 0.13050591 0.41168151] [0.06330729 0.5340644 0.47580567 0.42528617] [0.27122323 0.42713967 0.94541073 0.21462462]]
方法二:布尔掩码法(更通用)
如果以后你需要处理更复杂的删除场景(比如同一行删除多个元素),布尔掩码的方式会更灵活:
import numpy as np a = np.array([[0.15393912, 0.08129568, 0.34958515, 0.21266128, 0.92372852], [0.42450441, 0.1027468 , 0.13050591, 0.60279229, 0.41168151], [0.06330729, 0.60704682, 0.5340644 , 0.47580567, 0.42528617], [0.27122323, 0.42713967, 0.94541073, 0.21462462, 0.07293321]]) idxs = [(0,1), (1,3), (2, 1), (3,4)] rows, cols = zip(*idxs) # 创建一个和原数组形状相同的布尔掩码,初始全为True(表示保留该元素) mask = np.ones(a.shape, dtype=bool) # 将需要删除的位置设为False mask[rows, cols] = False # 通过掩码筛选保留的元素,然后重新塑形为目标形状 result = a[mask].reshape(a.shape[0], a.shape[1]-1) print(result)
这个方法的核心是用掩码标记要保留/删除的元素,再通过数组索引筛选出需要的部分,最后重新调整形状得到目标数组,同样能得到你想要的结果。
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

