2015-01-23 5 views
2

для программирования трещины Хэмминга в sage (компилятор на основе python) Мне нужно создать матрицу, в которой каждый столбец является двоичным представлением числа , говорят Хэмминг (3) матрица должна выглядеть следующим образомсоздать матрицу двоичного представления чисел в python

0 0 0 1 1 1 1 
0 1 1 0 0 1 1 
1 0 1 0 1 0 1 

, который является двоичным represenation чисел от 1 до 7. так, что я сделал до сих пор, чтобы преобразовать любое заданное число к, это двоичное представление: я сделал эту маленькую функцию она возьмите два значения n и r и повторителю n над r битами

binrep(n,r) 
    x=n 
    L=[] 
    LL=[] 
    while (n>0): 
     a=int(float(n%2)) 
     L.append(a) 
     n=(n-a)/2 
    while (len(L)<r): 
     L.append(0) 
    #print(L) 
    LL=L[::-1] 
    return LL 

так что теперь я хочу, чтобы собрать все LL я получил и сделать их в один большой матрице, как один выше

+0

Вы пытаетесь использовать функцию bin() в Python? –

+0

нет, я хочу, чтобы мои собственные функции :) – bobyy

+0

@bobyy Если вы хотите, чтобы ваши собственные функции, что вы делаете в Интернете, спрашиваете других людей, вместо того, чтобы писать их самостоятельно? – Carsten

ответ

2

Вы просто должны преобразовать все эти двоичные представления в списки целых чисел, собрать их в списке списков и, наконец, transpose, список списков для получения желаемого результата.

n = 3 
binary = [] 
for i in range(1, 2**n): 
    s = binrep(i, n) 
    binary.append(map(int, s)) 
matrix = zip(*binary) 

Или в одной строке: matrix = zip(*(map(int, binrep(i, n)) for i in range(1, 2**n)))

Результат

[(0, 0, 0, 1, 1, 1, 1), 
(0, 1, 1, 0, 0, 1, 1), 
(1, 0, 1, 0, 1, 0, 1)] 

Также отметим, что существуют и другие способы convert numbers to binary, например, используя str.format:

def binrep(n,r): 
    return "{0:0{1}b}".format(n, r) 
+0

Подождите ... вы можете вложить теги форматирования? Это потрясающе, спасибо! – Carsten

1

Как zoosuck упоминалось, я хотел бы предложить функцию бен() в замене в код. Для того, чтобы напечатать их в последовательности, при условии, что формат похож:

L = ['10101010', '10101010'] 

for i in L: 
    print ' '.join([j for j in i]) 

Подобным же образом, вы можете добавить его в список или словарь.

2

В дополнение к другим из них, ответ с помощью NumPy:

import numpy as np 

# we're creating the binary representation for all numbers from 0 to N-1 
N = 8 

# for that, we need a 1xN matrix of all the numbers 
a = np.arange(N, dtype=int)[np.newaxis,:] 

# we also need a log2(N)x1 matrix, for the powers of 2 on the numbers. 
# floor(log(N)) is the largest component that can make up any number up to N 
l = int(np.log2(N)) 
b = np.arange(l, dtype=int)[::-1,np.newaxis] 

# This step is a bit complicated, so I'll explain it below. 
print np.array(a & 2**b > 0, dtype=int) 

Печатается:

[[0 0 0 0 1 1 1 1] 
[0 0 1 1 0 0 1 1] 
[0 1 0 1 0 1 0 1]] 

Линия

print np.array(a & 2**b > 0, dtype=int) 

делает несколько вещей один раз. Я разберу его на более простые этапы:

# this takes our matrix b and creates a matrix containing the powers of 2 
# up to 2^log2(N) == N 
# (if N is a power of 2; otherwise, up to the next one below) 
powers = 2**b 

# now we calculate the bit-wise and (&) for each combination from a and b. 
# because a has one row, and b as one column, numpy will automatically 
# broadcast all values, so the resulting array has size log2(N)xN. 
u = a & powers 

# this is almost what we want, but has 4's in the first row, 
# 2's in the second row and 1's in the last one. 
# one method of getting 1's everywhere is to divide by powers: 
print u/powers 

# another way is to check where u > 0, which yields an array of bools, 
# which we then convert to numbers by turning it into an array of ints. 
print np.array(u > 0, dtype=int) 
+0

У меня нет абсолютно никакой идеи, как это работает, но это _does_ работать. :-) ... Один вектор чисел, один из двух степеней, затем каким-то образом перемножающий их матрицу. Wow ... –

+1

@tobias_k Я отредактировал свое сообщение и добавил объяснение. – Carsten

Смежные вопросы