Исправлен метод преобразования списка целых чисел в матрицу NumPy. - PullRequest
0 голосов
/ 30 марта 2019

Я хочу создать случайные целые числа и преобразовать их в двоичном формате через матрицу 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 ]

2 голосов
/ 30 марта 2019

Проблема в том, что преобразование в двоичное не всегда возвращает двоичное число одинаковой длины. Если первое целое число в C, скажем, 3, оно даст «0b11». Сложите это в массив, затем попытайтесь преобразовать 17. Ой, вы пытаетесь объединить '11' и '1001' вместе, это не сработает.

То, что я сделал здесь, это приведение длины преобразованного двоичного числа к 10 с помощью функции format () ( Преобразование в двоичное и сохранение ведущих нулей в Python ).

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.

0 голосов
/ 30 марта 2019

Попробуйте, он вернет список вместо массива, поэтому внесите необходимые изменения, если хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...