如何将形状为(3,32,32,32)的4维1bit数组合并为3维32bit数组?
合并4维1bit数组为3维32bit数组
核心思路
把最后一维的32个二进制位按对应权重累加,每个bit对应2^k的权重(k由该bit在32位整数中的位置决定),最终得到每个位置的32bit整数。
NumPy实现示例
假设你的数组是NumPy格式,以下是两种常见位序的处理方式:
情况1:最后一维索引0对应32位整数的最高位(第31位),索引31对应最低位(第0位)
import numpy as np # 生成示例4维1bit数组(替换成你的实际数组) bit_array = np.random.randint(0, 2, (3, 32, 32, 32), dtype=np.uint8) # 生成对应权重:2^31, 2^30, ..., 2^0 weights = 2 ** np.arange(31, -1, -1, dtype=np.int32) # 按位累加得到3维32bit数组 result = bit_array.dot(weights).astype(np.int32) # 若需要无符号整数,改用np.uint32
情况2:最后一维索引0对应32位整数的最低位(第0位),索引31对应最高位(第31位)
只需调整权重数组的顺序:
weights = 2 ** np.arange(32, dtype=np.int32) result = bit_array.dot(weights).astype(np.int32)
PyTorch实现示例(若用深度学习框架)
import torch bit_tensor = torch.randint(0, 2, (3, 32, 32, 32), dtype=torch.uint8) weights = torch.tensor(2 ** torch.arange(31, -1, -1), dtype=torch.int32) # 调整维度后做矩阵乘法 result = bit_tensor.to(torch.int32).matmul(weights).view(3, 32, 32)
说明
dot/matmul操作会自动将最后一维的32个bit与权重相乘后求和,直接压缩最后一维,得到目标形状(3,32,32)。- 数据类型选择
int32或uint32取决于你需要有符号还是无符号的32位整数。
内容的提问来源于stack exchange,提问作者WinstonNguyen
相关产品推荐
相关产品推荐

