2013-12-11 3 views
1

Как создать матрицу n на 2^n из 0 и 1 значений, где все столбцы различны? Например, если n = 2, то будетСоздайте матрицу со всеми возможными столбцами

0011 
0101 . 

И я могу использовать itertools для создания всех возможных кортежей.

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

Но как я могу сделать эти столбцы моей матрицы?

+0

, возможно, связано: http://stackoverflow.com/questions/1208118/using-numpy-to-build-an-array-of-all-combinations-of- двух-массивы – alko

ответ

2

Просто нанесите np.matrix на ваш результат:

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

О! Огромное спасибо. – marshall

+0

Одно замечание, убедитесь, что вы понимаете разницу между массивом и матрицей в numpy. Http://wiki.scipy.org/NumPy_for_Matlab_Users – aplassard

+0

@aplassard Спасибо. Мне просто нужно уметь их умножать. Но что означает «матричные объекты всегда имеют ровно 2-го ранга»?Рангом идентификационной матрицы должно быть количество строк, например. – marshall

2
X = numpy.array(map(lambda x: list(x), itertools.product([0,1],repeat = 2))) 

Получает ваш результат itertools и превращает каждый элемент в список, а затем превращает его в массив numpy. Если это не то направление, которое вы хотите, вы можете использовать.

X = X.transpose() 
0

Просто используйте список понимание:

Демо:

>>> 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]] 
+0

Мне нужно, чтобы это была матрица, поскольку я буду умножать ее на другую матрицу. – marshall

+0

Но его матрица! возможно, мне нужно отредактировать сообщение –

+0

@xndrme: матрица Numpy. Результат 'list (itertools.product ([0,1], repeat = 2))' также является матрицей. – jazzpi

2

Ради развлечений, в, вот это чистый способ:

>>> 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 этих, чтобы получить полномочия двух:

>>> 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]]) 

Divide:

>>> 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]]) 
+0

Блестящий! Но мне понадобилось некоторое время, чтобы понять ваш код. Могу ли я попросить несколько комментариев? – alko

+0

Это было весело, спасибо! – marshall

Смежные вопросы