我有以下问题。我想创建一个大小为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]]
答案 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)
您可以以类似的方式插入数据列。