在3D数组上迭代的python方法

在3D数组上迭代的python方法,python,arrays,loops,Python,Arrays,Loops,我在Python中有一个3D数组,我需要迭代数组中的所有多维数据集。也就是说,对于数组维度中的所有(x,y,z),我需要访问多维数据集: array[(x + 0, y + 0, z + 0)] array[(x + 1, y + 0, z + 0)] array[(x + 0, y + 1, z + 0)] array[(x + 1, y + 1, z + 0)] array[(x + 0, y + 0, z + 1)] array[(x + 1, y + 0, z + 1)] array[(

我在Python中有一个3D数组,我需要迭代数组中的所有多维数据集。也就是说,对于数组维度中的所有
(x,y,z)
,我需要访问多维数据集:

array[(x + 0, y + 0, z + 0)]
array[(x + 1, y + 0, z + 0)]
array[(x + 0, y + 1, z + 0)]
array[(x + 1, y + 1, z + 0)]
array[(x + 0, y + 0, z + 1)]
array[(x + 1, y + 0, z + 1)]
array[(x + 0, y + 1, z + 1)]
array[(x + 1, y + 1, z + 1)]
该数组是一个Numpy数组,尽管这不是必需的。我发现使用
numpy.fromfile()
用一行程序读取数据非常容易

有没有比下面更具python风格的迭代方式?这看起来很像使用Python语法的C

for x in range(x_dimension):
    for y in range(y_dimension):
        for z in range(z_dimension):
            work_with_cube(array[(x + 0, y + 0, z + 0)],
                           array[(x + 1, y + 0, z + 0)],
                           array[(x + 0, y + 1, z + 0)],
                           array[(x + 1, y + 1, z + 0)],
                           array[(x + 0, y + 0, z + 1)],
                           array[(x + 1, y + 0, z + 1)],
                           array[(x + 0, y + 1, z + 1)],
                           array[(x + 1, y + 1, z + 1)])
看一看,尤其是。您可以使用以下命令将三个循环压缩为一个

import itertools

for x, y, z in itertools.product(*map(xrange, (x_dim, y_dim, z_dim)):
    ...
也可以通过以下方式创建多维数据集:

cube = numpy.array(list(itertools.product((0,1), (0,1), (0,1))))
print cube
array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [0, 1, 1],
       [1, 0, 0],
       [1, 0, 1],
       [1, 1, 0],
       [1, 1, 1]])
并通过简单的加法添加偏移

print cube + (10,100,1000)
array([[  10,  100, 1000],
       [  10,  100, 1001],
       [  10,  101, 1000],
       [  10,  101, 1001],
       [  11,  100, 1000],
       [  11,  100, 1001],
       [  11,  101, 1000],
       [  11,  101, 1001]])
在您的情况下,它将转换为多维数据集+(x,y,z)。您的代码的非常紧凑的版本是

import itertools, numpy

cube = numpy.array(list(itertools.product((0,1), (0,1), (0,1))))

x_dim = y_dim = z_dim = 10

for offset in itertools.product(*map(xrange, (x_dim, y_dim, z_dim))):
    work_with_cube(cube+offset)

编辑
itertools.product
通过不同的参数生成产品,即
itertools.product(a,b,c)
,因此我必须用as
*map(…)
传递
map(xrange…)

答案是吗?这将是range(…-1),这里…实际上,是@tom10,它确实回答了这个问题,这导致了错误:ValueError:shape mismatch:对象无法广播到单个形状…但是,在您的示例中,使用
(x,y,z)
而不是
偏移量来修复
*
中的
*映射(…)
的作用是什么?@Nathan:它使用列表作为参数来调用函数<代码>s=[1,2,3];foo(*s)
foo(1,2,3)
相同,而
foo(s)
只传递
foo
一个参数,即列表
s
import itertools, numpy

cube = numpy.array(list(itertools.product((0,1), (0,1), (0,1))))

x_dim = y_dim = z_dim = 10

for offset in itertools.product(*map(xrange, (x_dim, y_dim, z_dim))):
    work_with_cube(cube+offset)