Python 创建一个包含所有可能列的矩阵

Python 创建一个包含所有可能列的矩阵,python,numpy,Python,Numpy,在所有列都不同的情况下,如何生成由0和1值组成的n×2^n矩阵?例如,如果n=2,则 0011 0101 . 我可以使用itertools生成所有可能的元组 list(itertools.product([0,1],repeat = 2)) 但是我如何使这些列成为我矩阵中的列呢 X = numpy.array(map(lambda x: list(x), itertools.product([0,1],repeat = 2))) 获取itertools结果,将每个元素转换为列表,然后将其转

在所有列都不同的情况下,如何生成由0和1值组成的n×2^n矩阵?例如,如果n=2,则

0011
0101 .
我可以使用itertools生成所有可能的元组

list(itertools.product([0,1],repeat = 2))
但是我如何使这些列成为我矩阵中的列呢

X = numpy.array(map(lambda x: list(x), itertools.product([0,1],repeat = 2)))
获取itertools结果,将每个元素转换为列表,然后将其转换为numpy数组。如果这不是你想要的方向,你可以使用

X = X.transpose()
获取itertools结果,将每个元素转换为列表,然后将其转换为numpy数组。如果这不是你想要的方向,你可以使用

X = X.transpose()

只需将np.matrix应用于结果:

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

只需将np.matrix应用于结果:

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

仅使用列表理解:

a = list(itertools.product([0,1],repeat = n))
[[p[i] for p in a] for i in xrange(n)]
演示:


仅使用列表理解:

a = list(itertools.product([0,1],repeat = n))
[[p[i] for p in a] for i in xrange(n)]
演示:


为了娱乐起见,这里有一个纯粹的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]])
然后我们关心的2的幂指数:

>>> np.arange(n)
array([0, 1])
比特移位1通过这些来获得2的幂:

>>> 1 << np.arange(n)
array([1, 2])
划分:

>>> np.arange(2**n) // (1 << np.arange(n))[::-1, None]
array([[0, 0, 1, 1],
       [0, 1, 2, 3]])

为了娱乐起见,这里有一个纯粹的简单方法:

>>> 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]])
然后我们关心的2的幂指数:

>>> np.arange(n)
array([0, 1])
比特移位1通过这些来获得2的幂:

>>> 1 << np.arange(n)
array([1, 2])
划分:

>>> 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(2**n)/(1哦!非常感谢。请注意,请确保您理解numpy@aplassard中数组和矩阵之间的区别。谢谢。我只需要能够将它们相乘。但是“矩阵对象总是具有精确的秩2”是什么呢平均值?例如,单位矩阵的秩应该是行数。听起来不错。两者的乘法功能不同。在numpy.matrix中\'*\'表示矩阵乘法,而乘法(A,B)表示元素乘法。在numpy.array中\'*\'表示元素互用和.dot(A)是矩阵乘法。哦!非常感谢。请注意,请确保您理解numpy@aplassard中数组和矩阵的区别。谢谢。我只需要能够将它们相乘。但是“矩阵对象始终具有精确的秩2”是什么呢平均值?例如,单位矩阵的秩应该是行数。听起来不错。两者的乘法功能不同。在numpy.matrix中\'*\'表示矩阵乘法,而乘法(A,B)表示元素乘法。在numpy.array中\'*\'表示元素互用和.dot(A)是矩阵乘法。可能相关:可能相关:我需要它是一个矩阵,因为我要将它与另一个矩阵相乘。@xndrme:Numpy矩阵。
list的结果(itertools.product([0,1],repeat=2))
也是一个矩阵。好吧,我从问题中了解到的是,我应该从元组中生成矩阵,而不是
Numpy
矩阵。列表始终是一个矩阵,但从示例中可以得出结论,必须从元组中生成。无论如何,我理解这一点。谢谢,我需要它是一个矩阵,因为我将它乘以其他矩阵。@xndrme:Numpy矩阵。
list的结果(itertools.product([0,1],repeat=2))
也是一个矩阵。好吧,我从问题中了解到的是,我应该从元组中生成矩阵,而不是
Numpy
矩阵。列表始终是一个矩阵,但从示例中可以得出结论,你必须从元组中生成。无论如何,我理解了这一点。谢谢你!但我花了相当长的时间才理解你你的代码。我可以问一些意见吗?太棒了!但我花了相当长的时间才理解你的代码。我可以问一些意见吗?