如何制作n乘2 ^ n矩阵的0和1值,其中所有列都是不同的?例如,如果n = 2那将是
0011
0101 .
我可以使用itertools来创建所有可能的元组。
list(itertools.product([0,1],repeat = 2))
但是如何制作矩阵的列?
答案 0 :(得分:2)
X = numpy.array(map(lambda x: list(x), itertools.product([0,1],repeat = 2)))
获取你的itertools结果并将每个元素转换为一个列表,然后将其转换为numpy数组。如果这不是您想要的方向,那么您可以使用。
X = X.transpose()
答案 1 :(得分:2)
只需将np.matrix应用于您的结果:
>>> np.matrix(list(itertools.product([0,1],repeat = 2)))
matrix([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
答案 2 :(得分:2)
为娱乐起见,这是一种纯粹的numpy方式:
>>> n = 2
>>> (np.arange(2**n) // ((1 << np.arange(n)[::-1,None]))) & 1
array([[0, 0, 1, 1],
[0, 1, 0, 1]])
>>> n = 4
>>> (np.arange(2**n) // ((1 << np.arange(n)[::-1,None]))) & 1
array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])
一些解释(请注意,我不太可能在生产代码中写上面的内容):
首先,我们得到了我们需要的数字:
>>> np.arange(2**n)
array([0, 1, 2, 3])
然后是我们关心的2的权力的指数:
>>> np.arange(n)
array([0, 1])
Bitshift 1通过这些获得2的权力:
>>> 1 << np.arange(n)
array([1, 2])
为了审美目的而交换订单:
>>> (1 << np.arange(n))[::-1]
array([2, 1])
使用None
引入额外的轴,因此我们可以广播:
>>> (1 << np.arange(n))[::-1, None]
array([[2],
[1]])
鸿沟:
>>> np.arange(2**n) // (1 << np.arange(n))[::-1, None]
array([[0, 0, 1, 1],
[0, 1, 2, 3]])
只取第一位:
>>> (np.arange(2**n) // (1 << np.arange(n))[::-1, None]) & 1
array([[0, 0, 1, 1],
[0, 1, 0, 1]])
答案 3 :(得分:0)
只需使用列表理解:
a = list(itertools.product([0,1],repeat = n))
[[p[i] for p in a] for i in xrange(n)]
演示:
>>> n = 2
>>> a = list(itertools.product([0,1],repeat = n))
>>> M = [[p[i] for p in a] for i in xrange(0,n)]
>>> M
[[0, 0, 1, 1], [0, 1, 0, 1]]
>>> n = 4
>>> a = list(itertools.product([0,1],repeat = 4))
>>> M = [[p[i] for p in a] for i in xrange(0,4)]
>>> M
[[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]]