如何在NumPy数组中提取元素值差值为±1的相邻索引对?
提取NumPy数组中相邻元素差值为±1的索引对
给定NumPy数组:
val = np.array([1,1,0,0,1,1,0,4,0,0,1])
需要提取相邻元素差值为1或-1(即0与1相互转换)的索引对,最终目标结果为[(1,2),(3,4),(5,6),(9,10)]。
问题分析
如果分别提取差值为1和-1的索引列表后,用**逻辑与(&)合并会触发ValueError,这是因为逻辑与要求同时满足两个条件,而一个差值不可能既是1又是-1,正确的做法是用逻辑或(|)**合并条件,或者直接用数组筛选一次性获取符合条件的位置。
解决方案
直接通过NumPy的差值计算和条件筛选,一步得到目标索引对:
- 计算数组相邻元素的差值:
np.diff(val)会返回长度比原数组少1的差值数组,每个元素对应原数组中val[i+1] - val[i]。 - 筛选出差值为1或-1的位置。
- 将这些位置转换为
(i, i+1)的索引对格式。
完整代码示例:
import numpy as np val = np.array([1,1,0,0,1,1,0,4,0,0,1]) # 计算相邻元素差值 diff_array = np.diff(val) # 筛选差值为1或-1的位置掩码 mask = (diff_array == 1) | (diff_array == -1) # 获取符合条件的索引 target_positions = np.where(mask)[0] # 转换为目标索引对 result = [(pos, pos+1) for pos in target_positions] print(result) # 输出: [(1, 2), (3, 4), (5, 6), (9, 10)]
也可以用更简洁的写法:
import numpy as np val = np.array([1,1,0,0,1,1,0,4,0,0,1]) result = [(i, i+1) for i in np.where(np.isin(np.diff(val), [1, -1]))[0]] print(result)
内容的提问来源于stack exchange,提问作者Bhar Jay
相关产品推荐
相关产品推荐

