我有一堆 400 万个整数向量,我必须将它们转换为二进制。我的代码如下:
def integer_vectors_to_binary(data, bits=16):
bin_arr = []
for arr in tqdm(data, desc="Processing", ncols=100):
binary_array = [list(map(int, format(x, f'0{bits}b'))) for x in arr]
bin_arr.append(np.array(binary_array).flatten())
return np.asarray(bin_arr)
现在的问题是,对于我非常大的输入集来说,这个过程花费的时间太长。因此,我想知道这段代码是否可以优化。这是一个示例输出:
vec_a = np.asarray([12, 15, 14])
print(integer_vectors_to_binary([vec_a])
输出为:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]])
如果你有 400 万个向量,那么
tqdm
将更新输出 400 万次。当速度很重要时,我不会在那么多输出周期上浪费时间。
此外,您应该避免转换为字符串然后再转换回整数。您可以使用位运算符来隔离每个位并使用它。
代码:
def integer_vectors_to_binary(data, bits=16):
return np.asarray([
[
(x >> shift) & 1
for x in arr
for shift in range(bits - 1, -1, -1)
]
for arr in data
])
如果在此过程中您确实需要进度条,请将输入分成 100 个块,并对这 100 个块执行转换,并且仅在
that(最外层)循环中调用
tqdm
。