Nat*_*man 7 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)]
Run Code Online (Sandbox Code Playgroud)
该数组是一个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)])
Run Code Online (Sandbox Code Playgroud)
Ott*_*ger 18
看一下itertools,特别是itertools.product.您可以将三个循环压缩为一个
import itertools
for x, y, z in itertools.product(*map(xrange, (x_dim, y_dim, z_dim)):
...
Run Code Online (Sandbox Code Playgroud)
您也可以这样创建多维数据集:
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]])
Run Code Online (Sandbox Code Playgroud)
并通过简单的添加添加偏移量
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]])
Run Code Online (Sandbox Code Playgroud)
哪个会翻译成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)
Run Code Online (Sandbox Code Playgroud)
编辑:itertools.product使产品超过不同的参数,即itertools.product(a,b,c),所以我必须传递map(xrange, ...)as*map(...)
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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11616 次 |
| 最近记录: |