二进制矩阵条目

时间:2016-04-25 17:12:28

标签: python numpy matrix binary counting

我有以下问题。我想创建一个大小为2 ^ L x L + 2的numpy矩阵。在第一列中是变量,我稍后在程序中定义。在最后的L列中应该是分配零和1的所有可能性(在我看来,二进制计数可以是一个选项,参见示例)在第二列中是1的数量。我需要此列来为第二列对矩阵进行排序。

[[ x1, 0,  0,  0,  0]
[ x2, 1, 0,  0,  1]
[ x3, 1, 0,  1,  0]
[ x4, 2, 0,  1,  1]
[ x5, 1, 1,  0,  0]
[ x6, 2, 1,  0,  1]
[ x7, 2, 1,  1,  0]
[ x8, 3, 1,  1,  1]]

2 个答案:

答案 0 :(得分:1)

这将为您提供包含您描述的内容的元组列表。您当然可以更改为lists / arrays / matrices / whatever。

import itertools
L = []
k = 3
combs = itertools.combinations_with_replacement([0,1], k)
perms = [y for c in combs for y in set(itertools.permutations(c))]
for c in perms:
    L.append(('myvar',sum(c)) + c)

输出:

In [42]: L
Out[42]:
[('myvar', 0, 0, 0, 0),
 ('myvar', 1, 1, 0, 0),
 ('myvar', 1, 0, 1, 0),
 ('myvar', 1, 0, 0, 1),
 ('myvar', 2, 0, 1, 1),
 ('myvar', 2, 1, 1, 0),
 ('myvar', 2, 1, 0, 1),
 ('myvar', 3, 1, 1, 1)]

将wrt排序为"列" (示例中为第1列),您可以使用

import operator
sorted(L, key=operator.itemgetter(1))

答案 1 :(得分:1)

你要求的东西似乎不太可能是你真正需要的,以解决你遇到的任何问题。也就是说,通过利用numpy的广播能力来生成RHS很容易:

>>> L = 3
>>> m = (np.arange(2**L)[:,None] >> np.arange(L)[::-1]) & 1
>>> m
array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [0, 1, 1],
       [1, 0, 0],
       [1, 0, 1],
       [1, 1, 0],
       [1, 1, 1]], dtype=int32)
>>> np.hstack([m.sum(1,keepdims=True), m])
array([[0, 0, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [2, 0, 1, 1],
       [1, 1, 0, 0],
       [2, 1, 0, 1],
       [2, 1, 1, 0],
       [3, 1, 1, 1]], dtype=int32)

您可以以类似的方式插入数据列。