三维数组上的Pythonic迭代法

2024-06-17 11:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 数据方法in程序numpyfor语法range
2条回答
import itertools
for x, y, z in itertools.product(xrange(x_size), 
                                 xrange(y_size), 
                                 xrange(z_size)):
    work_with_cube(array[x, y, z])

看看itertools,尤其是itertools.product。你可以用

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

在您的情况下,它将转换为cube + (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, ...)

相关问题 更多 >