3

我想循环一个三维数组。有没有比以下更有效(或更快)的替代方法?

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

在此示例中,x、y 和 z 是三个一维数组。

我的源代码是这样的,我不想要列表的值。

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]) 

p是 3d 阵列

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 回答