优化将整数向量转换为二进制向量

问题描述 投票:0回答:1

我有一堆 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]])

python numpy performance optimization
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

© www.soinside.com 2019 - 2024. All rights reserved.