我想循环一个三维数组。有没有比下面更有效(或更快)的替代方法?
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数组
答案 0 :(得分: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)
答案 1 :(得分:2)
你也可以这样做
for i in x:
for j in y:
for k in z:
print i,j,k
答案 2 :(得分:0)
你不需要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)