我有一个位数组。
输入:array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0])
我需要将其转换为整数数组,从 1 位读取 5 个无符号整数。
输出:array([1, 19, 14])
因为:(00001
->1
,10011
->19
,01110
->14
(
我可以用numpy(或普通的Python(来做吗?
如果我需要 6 位到无符号整数怎么办?
改形为 Nx5 数组,并使用广播乘法和总和沿 length-5 轴减小:
temp = arr.reshape((-1, 5))
temp = temp * [16, 8, 4, 2, 1] # you can use *= here if you don't need to preserve the input
result = temp.sum(axis=1)
这有点复杂。马拜,这是一个更好的方法。 但它有效。此解决方案没有 Numpy。
s = ""
arr = []
for n, i in enumerate(lst):
mod = n % 5
s += str(i)
if mod == 4:
s += " "
for item in s.split():
arr.append(int(str(item), 2))
print(arr)
Output:
[1, 14, 19]
我建议使用因子数组。使用此因子数组,您可以遍历数据并将每个块与此因子数组相乘并计算其总和(这是位模式的相互影响(
def bitToInt(data, bits):
factor_arr = np.ones(bits)
for i in range(bits):
factor_arr[0:i] = factor_arr[0:i] * 2
res = []
for i in range(int(len(data)/bits)):
chunk = data[i*bits:(i+1)*bits]
res.append(int((chunk * factor_arr).sum()))
return np.array(res)
这使 Numpy 可以使用矢量指令进行数组多重运算和块上的水平总和。
PS:可能有更好的chunk = data[i*bits:(i+1)*bits]
方法