修复了将整数列表转换为NumPy矩阵的方法

时间:2019-03-30 10:44:13

标签: python python-3.x numpy

我想创建随机整数并通过NumPy矩阵将它们转换为二进制格式。我写了以下代码:

def toBinary(C):
    l = []
    for x in C:
        b = [int(i) for i in bin(x)[2:]]
        l = np.vstack((l, np.array(b)))
    return l

list_vectors = [random.randint(0, 2 ** 64) for _ in range(2)]
print(toBinary(list_vectors))

但是我仍然不知道如何解决该错误:

Traceback (most recent call last):
  File "test.py", line 31, in <module>
    print(toBinary(list_vectors))
  File "test.py", line 27, in toBinary
    l = np.vstack((l, np.array(b)))
  File "/anaconda3/lib/python3.6/site-packages/numpy/core/shape_base.py", line 234, in vstack
    return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
ValueError: all the input array dimensions except for the concatenation axis must match exactly

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:2)

这里的问题是,转换为二进制并不总是返回相同长度的二进制数。 如果C中的第一个整数为3,则将给出'0b11'。将其堆叠在数组中,然后尝试转换17。糟糕,您正在尝试将'11'和'1001'连接在一起,它将无法工作。

然后我在这里所做的就是使用format()函数(Convert to binary and keep leading zeros in Python)将转换后的二进制数长度强制为10。

import numpy as np
import numpy.random as random

def toBinary(C):
    binaries_length = 10
    bin_format = f'#0{binaries_length+2}b'
    array_rows = len(C)
    l = np.empty((array_rows, binaries_length))
    for i, x in enumerate(C):
        l[i,:] = np.array([int(i) for i in format(x, bin_format)[2:]])
    return l

list_vectors = [random.randint(0, 2 * 64) for _ in range(10)]

print(toBinary(list_vectors))

另外,返回的数组是预先分配的,因为您现在完全知道它将是什么大小:

binaries_length = 10
bin_format = f'#0{10+2}b'
array_rows = len(C)
l = np.empty((array_rows, binaries_length))

顺便说一句,调用random.randint(0,2 ** 64)也会触发异常,因为2 ** 64太高了,所以我在这里将其更改为2 * 64。

进一步,您可以通过找到C的最大值来找到最佳二进制长度。

答案 1 :(得分:0)

尝试此操作,它将返回列表而不是数组,因此,如果您愿意,请进行必要的调整:

def toBinary(C):
    l = []
    for x in C:
        b = [i for i in bin(x)[2:]]
        a="".join(b)
        a=int(a)
        l.append(a)
return l