Итерация по матрицам в numpy

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

for M in ....:

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

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

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

2 ответов


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

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

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

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

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

может быть какая-то функция numpy 'grid', которая делает то же самое, но мое воспоминание из других обсуждений это 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))