创建包含每个可能列的矩阵

时间:2013-12-11 20:21:49

标签: python numpy

如何制作n乘2 ^ n矩阵的0和1值,其中所有列都是不同的?例如,如果n = 2那将是

0011
0101 .

我可以使用itertools来创建所有可能的元组。

list(itertools.product([0,1],repeat = 2))

但是如何制作矩阵的列?

4 个答案:

答案 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]]