Как я могу положить в 2D-массив список двоичной строки - PullRequest
0 голосов
/ 22 марта 2020

У меня есть двоичный список строковых чисел следующим образом:

['0b111',
 '0b1110011',
 '0b1110100',
 '0b11101001',
 '0b1100111',
 '0b1100001',
 '0b1101110',
 '0b1101111']

И я хотел бы поместить этот список в двумерный массив целых чисел следующим образом:

array([[0, 0, 0, 0, 0, 1, 1, 1],
       [0, 1, 1, 1, 0, 0, 1, 1],
       [0, 1, 1, 1, 0, 1, 0, 0],
       [1, 1, 1, 0, 1, 0, 0, 1],
       [0, 1, 1, 0, 0, 1, 1, 1],
       [0, 1, 1, 0, 0, 0, 0, 1],
       [0, 1, 1, 0, 1, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 1, 1]], dtype=uint8)

I сначала удалили «0b» двоичных последовательностей и поместили его в список res. Затем я создал 2D-массив, чтобы поместить в него свой список. И я попытался сделать двойной l oop, но я немного запутался с этим:

 res = []
    for i in range(len(conv_bin)):
        res.append(conv_bin[i][2:])
    arr = np.array(res)
    arr2 = np.zeros((8,8))
    for i in range(arr.shape[0]):
        for j in range(arr2.shape[0]):
            arr2[i] = arr[j]

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Вы можете использовать функцию numpy unpackbits , чтобы помочь.

import numpy as np
conv_bin = ['0b111',
            '0b1110011',
            '0b1110100',
            '0b11101001',
            '0b1100111',
            '0b1100001',
            '0b1101110',
            '0b1101111']

np.unpackbits(np.array([[int(s,2)] for s in conv_bin], dtype=np.uint8), axis=1)
1 голос
/ 22 марта 2020
  • Я думаю, что вы можете избежать создания нескольких новых списков, таких как res и arr2, а также решение, которое я пишу ниже.
  • Простым решением было бы перебрать двоичную матрицу в обратном порядке
arr2 = np.zeros((8,8))
for i in range(len(conv_bin)):
    '''
    1. zip is function is to loop across two variables in this for loop
    2. j is traversing each binary in the reverse order only until the 2nd index, 
    3. k is used to index the resultant array from reverse (we need different variables since the index values differ)
    '''
    for j,k in zip(range(len(conv_bin[i])-1, 1, -1), range(-1,-9,-1 )):
        arr2[i][k] = conv_bin[i][j]

PS - Если вы не знали, в python вы можете индексировать массив из и наоборот:
arr [-1] -> последний элемент массива
arr [-2] -> последний, но один элемент
arr [-3] -> последний, но два элемента и т. д.

Надеюсь, я был ясен в своем ответе

1 голос
/ 22 марта 2020

Если вы хотите использовать для циклов, вы можете использовать это:

import numpy as np
conv_bin=['0b111',
 '0b1110011',
 '0b1110100',
 '0b11101001',
 '0b1100111',
 '0b1100001',
 '0b1101110',
 '0b1101111']
res =[]
for string in conv_bin:
    ls=[]
    string=string[2:]
    for ch in string:
        ls.append(ch)
    res.append(ls)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...