2013-12-20 26 views
6

numpyで2 ^(n^2)の2進数のn行n列の行列(または2次元配列)をどのように反復処理できますか?私は何かたいと思います:numpyで行列を反復する

for M in ....: 

あなたがitertools.product([0,1], repeat = n**2)を使用して、2D numpyの配列に変換する必要がありますか?

このコードは私にランダムな2dバイナリ行列を与えますが、それは私が必要とするものではありません。 2**(n**2)も比較的小さいnの大きな数であるので、あなたのループが長いindefinetely実行する可能性があることを

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

何をしようとするの? Numpyはベクトル化されているため、多くの操作で明示的に反復処理する必要はありません。 – MattDMo

+0

@MattDMo 2dバイナリn×nの各行列に対してテストを実行したい。 nは非常に小さいので、これは実行可能でなければなりません。 – marshall

+0

どのくらいの大きさにすることができますか?あなたは2 **(n ** 2)の成長率を知っていますか? – alko

答えて

4

注意。

ビーイングは、あなたが必要とする行列を反復処理する1つの方法は、例えばある

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'の代わりに'&1'を行う方が速いでしょう。また、 '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)) 

はある時点でのn×nの配列1を発生する発電機:

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

それとも同じ3D配列を生成する:

np.array(list(g))