Python中如何获取数组从1转换为0时的索引位置
数组中1转0的索引位置提取优化方案
问题描述
给定数组:
val = [[1,1,1,0,0,1,1,0,0,0], [0,1,1,1,0,1,1,0,0,0]]
需要提取数组中值从1转换为0的索引位置,预期输出:
[[(2,3),(4,5),(6,7)],[(0,1),(3,4),(4,5),(6,7)]]
尝试使用np.gradient的代码:
import numpy as np X = np.gradient(val, axis=1) Y = np.gradient(val, axis=0) trans_YX = np.array(list(zip(Y.ravel(), X.ravel())), dtype('f4,f4')).reshape(Y.shape)
当前输出(梯度值数组):
[[(-1., 0. ) ( 0., 0. ) ( 0., -0.5) ( 1., -0.5) ( 0., 0.5) ( 0., 0.5) ( 0., -0.5) ( 0., -0.5) ( 0., 0. ) ( 0., 0. )] [(-1., 1. ) ( 0., 0.5) ( 0., 0. ) ( 1., -0.5) ( 0., 0. ) ( 0., 0.5) ( 0., -0.5) ( 0., -0.5) ( 0., 0. ) ( 0., 0. )]]
更优实现方法
针对离散二进制数组的1→0转换检测,使用np.diff是更直接高效的方案,逻辑如下:
- 对每一行计算相邻元素的差值(后项减前项)
- 当差值为
-1时,说明前一个元素是1、后一个是0,对应转换位置为(i, i+1)(i为当前差值的索引)
代码实现
import numpy as np val = np.array([[1,1,1,0,0,1,1,0,0,0], [0,1,1,1,0,1,1,0,0,0]]) result = [] for row in val: # 计算行内相邻元素的差值 row_diffs = np.diff(row) # 定位差值为-1的索引(即1→0的转换起始点) transition_indices = np.where(row_diffs == -1)[0] # 转换为预期的索引对格式 row_result = [(idx, idx+1) for idx in transition_indices] result.append(row_result) print(result)
方案优势
- 逻辑精准:直接匹配“1转0”的定义,无需处理梯度带来的浮点值筛选问题
- 效率更高:
np.diff仅做简单的元素减法运算,计算量远小于梯度计算 - 结果直接:一步得到预期的索引对格式,无需额外的数据转换或筛选
内容的提问来源于stack exchange,提问作者Bhar Jay
相关产品推荐
相关产品推荐

