3

3次元配列をループしたい。以下よりも効率的(または高速)な代替方法はありますか?

for i, j, k in itertools.product(*map(xrange, (len(x), len(y), len(z))))

この例では、x、y、zは3つの1次元配列です。

私のソースコードはこれです、私はリストの価値を望んでいません。

for i, j, k in itertools.product(*map(xrange, (len(x0), len(y0), len(z0)))):
       print "p[%d][%d][%d] = %d" % (x0[i], y0[j], z0[k], p[i][j][k]) 

p3Dアレイであること

4

3 に答える 3

6

代わりに、リスト自体をループしないのはなぜですか?

for i, j, k in itertools.product(x, y, z):

現在、インデックスはありません。実際の値があります。

>>> x, y, z = range(3), range(3, 6), range(6, 9)
>>> for i, j, k in itertools.product(x, y, z):
...     print i, j, k
... 
0 3 6
0 3 7
0 3 8
0 4 6
# .. ~ ..
2 4 8
2 5 6
2 5 7
2 5 8

インデックスも必要な場合enumerate()、次を使用してください。

>>> for (ii, i), (jj, j), (kk, k) in itertools.product(*map(enumerate, (x, y, z))):
...     print (ii, i), (jj, j), (kk, k)
... 
(0, 0) (0, 3) (0, 6)
(0, 0) (0, 3) (1, 7)
(0, 0) (0, 3) (2, 8)
(0, 0) (1, 4) (0, 6)
# .. ~ ..
(2, 2) (1, 4) (2, 8)
(2, 2) (2, 5) (0, 6)
(2, 2) (2, 5) (1, 7)
(2, 2) (2, 5) (2, 8)
于 2013-03-27T10:36:42.960 に答える
2

これもできます

for i in x:
  for j in y:
    for k in z:
      print i,j,k
于 2013-03-27T10:58:20.303 に答える
1

x、y、zリストは必要ないので、インデックスがある場合とない場合で、配列をループする次の方法は、それらを使用しないという意味ですべてより効率的です。

import itertools
from pprint import pprint

W,H,D = 3,4,5
p = [[[k*W*H + j*W+i for i in xrange(3)] for j in xrange(4)] for k in xrange(5)]
assert (W,H,D) == (len(p[0][0]),len(p[0]),len(p))
pprint(p)

print
for i, j, k in itertools.product(xrange(D), xrange(H), xrange(W)):
    print "p[%d][%d][%d] = %d" % (i, j, k, p[i][j][k])
print
for i in xrange(D):
    for j in xrange(H):
        for k in xrange(W):
            print "p[%d][%d][%d] = %d" % (i, j, k, p[i][j][k])
print
for col in p:
    for row in col:
        for elem in row:
            print elem
print
for i, col in enumerate(p):
    for j, row in enumerate(col):
        for k, elem in enumerate(row):
            print "p[%d][%d][%d] = %d" % (i, j, k, elem)
于 2013-03-27T16:07:03.747 に答える