繁体   English   中英

在python中创建数字的二进制表示形式的矩阵

[英]create a matrix of binary representation of numbers in python

为了在鼠尾草中编码汉明鳕鱼(基于python的编译器),我需要创建一个矩阵,其中每一列都是数字的二进制表示,例如Hamming(3),矩阵应如下所示

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

这是从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,并像上面的一样将它们放在一个大矩阵中

您只需要将所有这些二进制表示形式转换为整数列表,将它们收集在列表列表中,然后最后对列表列表进行转置即可获得所需的输出。

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)]

另请注意,还有其他将数字转换为二进制的方法 ,例如,使用str.format

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

除了其他答案,还使用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)

就像提到的zoosuck一样,我建议使用bin()函数代替您的代码。 假设格式相似,要按顺序打印它们:

L = ['10101010', '10101010']

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

您可以通过类似的方式将其附加到列表或字典中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM