问题描述
我在 Python 中有一个 3D 数组,我需要遍历数组中的所有立方体.也就是说,对于数组维度中的所有 (x,y,z)
我需要访问多维数据集:
I have a 3D array in Python and I need to iterate over all the cubes in the array. That is, for all (x,y,z)
in the array's dimensions I need to access the 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)]
该数组是一个 Numpy 数组,尽管这并不是必需的.我刚刚发现使用 numpy.fromfile()
使用单行读取数据非常容易.
The array is a Numpy array, though that's not really necessary. I just found it very easy to read the data in with a one-liner using numpy.fromfile()
.
有没有比以下更多的 Pythonic 方法来迭代这些?这看起来就像使用 Python 语法的 C.
Is there any more Pythonic way to iterate over these than the following? That simply looks like C using Python syntax.
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.您可以使用
Have a look at itertools, especially itertools.product. You can compress the three loops into one with
import itertools
for x, y, z in itertools.product(*map(xrange, (x_dim, y_dim, z_dim)):
...
您也可以通过这种方式创建多维数据集:
You can also create the cube this way:
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]])
并通过简单的加法添加偏移量
and add the offsets by a simple addition
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)
.您的代码的非常紧凑的版本是
which would to translate to cube + (x,y,z)
in your case. The very compact version of your code would be
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(...)
Edit: itertools.product
makes the product over the different arguments, i.e. itertools.product(a,b,c)
, so I have to pass map(xrange, ...)
with as *map(...)
这篇关于迭代 3D 数组的 Pythonic 方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!