从位编码数组提取通道:Python实现问题求助
在Python中正确提取位编码数组的通道信号
嘿,我一眼就看出问题所在了——你在Python里误用了幂运算的符号!
Matlab里2^1确实是计算2的1次方,但在Python中,^是异或运算符,不是幂运算!这就是你用np.bitwise_and(digital_word, 2^1)得到错误结果的核心原因,2^1在Python里算出来是3(二进制10异或01等于11),完全不是你要的掩码。
先明确编码对应的二进制位
根据你的规则,每个通道对应一个二进制位:
- 通道1对应第0位(数值为
2**0=1):编码1、3、5包含该通道 - 通道2对应第1位(数值为
2**1=2):编码2、3、6包含该通道 - 通道3对应第2位(数值为
2**2=4):编码4、5、6包含该通道
正确的Python实现代码
我们用numpy来实现,核心是用正确的掩码(2**n或者移位运算),然后判断对应位是否被设置:
import numpy as np # 你的输入数组 digital_word = np.array([0,0,1,0,1,0,3,4,5,6]) # 方法1:用bitwise_and + 非零判断 channel1 = (np.bitwise_and(digital_word, 1) != 0).astype(int) channel2 = (np.bitwise_and(digital_word, 2) != 0).astype(int) channel3 = (np.bitwise_and(digital_word, 4) != 0).astype(int) # 方法2:更简洁的移位运算(推荐) channel1 = (digital_word >> 0) & 1 channel2 = (digital_word >> 1) & 1 channel3 = (digital_word >> 2) & 1 # 输出结果 print("通道1:", channel1.tolist()) print("通道2:", channel2.tolist()) print("通道3:", channel3.tolist())
运行结果
和你期望的完全一致:
通道1: [0, 0, 1, 0, 1, 0, 1, 0, 1, 0] 通道2: [0, 0, 0, 0, 0, 0, 1, 0, 0, 1] 通道3: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
小解释
- 方法1中,
np.bitwise_and会保留对应位的数值,只要结果非零,就说明该通道被编码了,转成int后就得到1/0的结果 - 方法2的移位运算更直观:把数字右移n位后,和1按位与,直接取出第n位的值(0或1),代码更简洁高效
内容的提问来源于stack exchange,提问作者MadMax
相关产品推荐
相关产品推荐

