【问题标题】:List [0-1] to binary representation fast将 [0-1] 列表快速转为二进制表示
【发布时间】:2021-03-10 13:50:38
【问题描述】:

我正在尝试将矩阵的 [0-1] 行转换为数字表示(二进制等效),我拥有的代码如下:

import numpy as np

def generate_binary_matrix(matrix):
    result = []
    for i in matrix:
        val = '0b' + ''.join([str(x) for x in i])
        result.append(int(val, 2))
    result = np.array(result)
    return result

initial_matrix = np.array([[0, 1, 0], [1, 0, 0], [0, 0, 1]])
result = generate_binary_matrix(initial_matrix )
print(result)

此代码有效,但速度很慢,有谁知道如何以更快的方式完成?

【问题讨论】:

  • 在python3中...

标签: python-3.x performance numpy matrix binary


【解决方案1】:

您可以仅使用算术将 0/1 列表转换为二进制,这应该更快:

from functools import reduce
b = reduce(lambda r, x: 2*r + x, i)

【讨论】:

  • 试试看不明白怎么用?
  • 您可以将代码中的val = ...; result.append(int(val, 2)) 替换为result.append(reduce(lambda r, x: 2*r + x, i))
  • 发生的事情是函数reduce生成了我,结果是inf,我想这是因为我尝试生成的二进制文件非常大。
  • 对不起,我不知道没有看到可重现的例子。
  • 你好,我编辑了函数的代码并添加了一个例子。
【解决方案2】:

假设您的矩阵 numpy 数组是 Am 行和 n 列。 使用nelements 创建一个b 向量:

b = np.power(2, np.arange(n))[::-1]

那么你的答案是A @ b

例子:

import numpy as np
A = np.array([[0, 0, 1], [1, 0, 1]])
n = A.shape[1]
b = np.power(2, np.arange(n))[::-1]
print(A @ b)  # --> [1 5]

更新 - 我颠倒了 b,因为 MSB (2^n-1) 是 A[:,0] + 幂参数被错误地翻转 + 添加示例。

【讨论】:

  • 试试这个: def generate_binary_matrix(matrix): b = np.power(np.arange(len(matrix[0])), 2) result_v2 = matrix @ b 但不一样结果
  • lsb 是哪一位?每行的第一个元素还是最后一个元素?
  • 我不知道 lsb 位是什么,但我们假设矩阵有以下形式:[[0,0,1], [1,0,1]] 我想要生成类似这样的内容:[b'001, b '101]。
  • 好的。我更新了我的答案。 LSB = 最低有效位 MSB = 最高有效位
  • 好的,LSB 将是最后一个,MSB 将是第一个,我需要将特定大小 m 的数组 [0,0,1,0,1] 的二进制表示为二进制相同大小的 m b'00101
猜你喜欢
  • 2019-04-09
  • 2013-11-07
  • 2013-01-09
  • 2017-12-22
  • 2012-03-06
  • 1970-01-01
  • 2021-07-12
  • 2013-02-15
  • 2017-03-02
相关资源
最近更新 更多