Итерация по матрицам в 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))