2013-12-20 3 views
6

Как вы можете перебирать все двоичные n^n (n^2) двоичные n на n матриц (или 2d массивов) в numpy? Я бы что-то вроде:Итерация над матрицами в numpy

for M in ....: 

Вы должны использовать itertools.product([0,1], repeat = n**2), а затем преобразовать в 2d Numpy массива?

Этот код даст мне случайную двоичную матрицу 2d, но это не то, что мне нужно.

np.random.randint(2, size=(n,n)) 
+1

Что вы пытаетесь сделать? Numpy векторизован, поэтому для многих операций вам не нужно явно выполнять итерацию. – MattDMo

+0

@MattDMo Я хочу запустить тест для каждой 2d бинарной n на n матрицу. n будет очень маленьким, чтобы это было выполнимо. – marshall

+0

Насколько большой n может быть? знаете ли вы 2 ** (n ** 2) темпы роста? – alko

ответ

4

Обратите внимание, что 2**(n**2) является большим количеством для даже относительно небольшого п, так что ваш цикл может работать indefinetely долго.

Бытие говорит, что один из возможных способов итерации матриц, нужно, например,

nxn = np.arange(n**2).reshape(n, -1) 
for i in xrange(0, 2**(n**2)): 
    arr = (i >> nxn) % 2 
    # do smthng with arr 
+0

Ницца! Скорее всего, быстрее '' и '' вместо '% 2'. Кроме того, если 'nxn' является кратным 8, может быть быстрее вызвать [' np.unpackbits'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.unpackbits.html) , – Jaime

2
np.array(list(itertools.product([0,1], repeat = n**2))).reshape(-1,n,n) 

производит (2^(n^2),n,n) массива.

Может быть какая-то функция «сетки», которая делает то же самое, но мое воспоминание из других обсуждений заключается в том, что itertools.product довольно быстро.

g=(np.array(x).reshape(n,n) for x in itertools.product([0,1], repeat = n**2)) 

является генератор, который производит NxN массивов один момент времени:

g.next() 
# array([[0, 0],[0, 0]]) 

Или производить тот же 3d массив:

np.array(list(g)) 
Смежные вопросы