二进制矩阵条目
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)
您可以用类似的方式插入您的数据列。
我有以下问题。我想创建一个大小为 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)
您可以用类似的方式插入您的数据列。