二进制矩阵条目

Binary matrix entries

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

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

这将为您提供包含您描述的内容的元组列表。你当然可以改成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 排序为 "column"(示例中的第 1 列),您可以使用

import operator
sorted(L, key=operator.itemgetter(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)

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