遍历 3D 数组的 Pythonic 方式

标签 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[(x + 0, y + 1, z + 1)]
array[(x + 1, y + 1, z + 1)]

该数组是一个 Numpy 数组,尽管这并不是必需的。我只是发现使用 numpy.fromfile() 一行代码读取数据非常容易。

有没有比以下更 Pythonic 的方法来迭代这些?这看起来就像使用 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)])

最佳答案

看看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),所以我必须通过 map(xrange, ...) 作为 *map(...)

关于遍历 3D 数组的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316068/

相关文章:

通过引用传递给函数来更改数组的元素

arrays - MATLAB 中向量数组的向量范数

python - 打破无限循环的正确 Python 异常(不应该是无限的)

python - 如何不将 False/其他值评估为 0

python - ValueError : Input 0 of layer conv2d_10 is incompatible with the layer: expected ndim=4, 发现 ndim=3。收到完整形状 : [None, 100, 100]

python - 我可以在单个 heroku (python) dyno 中运行多个线程吗?

python - 旋转 matplotlib Path 对象

python - 在 apache flink 中嵌入现有的 ML 模型

JavaScript ES6 - 计算对象数组的重复项

c++ - C++扫描字符串的方法