You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NumPy获取Python中二进制数组(含二维)的十进制值

高效将布尔型NumPy数组转换为十进制值数组的方法

当然有更简便的方式!NumPy的向量化操作天生就适合这类批量计算,完全不用手动做与或运算、提取位置再求和的繁琐步骤,几步就能搞定。

核心思路

布尔型数组在NumPy中会自动被视为1(True)和0(False),我们只需要给每个二进制位分配对应的权重(比如2^0, 2^1, ..., 2^(n-1),顺序取决于你的二进制位排列),然后通过向量化的乘法+求和(或点积)直接得到每行的十进制值。

具体实现方法

方法1:按行求和(最通用)

假设你有一个二维布尔数组bool_arr(每行代表一个二进制数),以及对应的一维权重数组weights(每个元素对应二进制位的权重,比如最高位对应最大的权重):

import numpy as np

# 示例:二维布尔数组,每行是一个二进制数(比如第一行是101,对应十进制5)
bool_arr = np.array([[True, False, True], [False, True, True]])
# 对应权重:第一位是2^2=4,第二位2^1=2,第三位2^0=1
weights = np.array([4, 2, 1])

# 批量计算每行的十进制值
decimal_values = np.sum(bool_arr * weights, axis=1)
print(decimal_values)  # 输出: [5 3]

方法2:点积运算(更简洁)

用np.dot可以替代求和操作,代码更简洁,效果完全一致:

decimal_values = bool_arr.dot(weights)

方法3:固定长度二进制用np.packbits(适合8/16等位宽)

如果你的二进制数是固定字节长度(比如8位),可以用np.packbits直接打包成字节值(即十进制数),注意要调整位的顺序(默认是从高位到低位打包):

# 示例:每行是8位二进制,低位在前的话需要先反转
bool_arr_8bit = np.array([[True, False, True, False, False, False, False, False]])
# 反转后让高位在前,符合packbits的默认规则
packed = np.packbits(bool_arr_8bit[:, ::-1], axis=1)
print(packed[0][0])  # 输出: 40(对应二进制10100000,即十进制40)

注意事项

  • 权重数组的顺序必须和布尔数组的二进制位对应:如果布尔数组的第一列是最高位,权重数组的第一个元素就要是2^(n-1)(n为每行的位数),别搞反顺序,否则结果会出错。
  • 向量化操作比循环快几个数量级,尤其是处理大数组时,一定要优先用NumPy的内置函数,避免手动遍历。

内容的提问来源于stack exchange,提问作者poda_badu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:39:53