简单地遍历 Python 中的多维数组
Simply loop over multi-dimensional array in Python
假设我想遍历多维数组的索引。
我目前拥有的是:
import numpy as np
points = np.ndarray((1,2,3))
for x in range(points.shape[0]):
for y in range(points.shape[1]):
for z in range(points.shape[2]):
print(x,y,z)
我想减少嵌套并能够在一个简单的单行代码中循环遍历多维数组的所有索引。是不是也可以写成下面的形式?
points = np.ndarray((1,2,3))
for (x, y, z) in ?? :
print(x,y,z)
使用 iterools
:
import itertools
x_dim, y_dim, z_dim = points.shape
for x, y, z in itertools.product(*map(range, (x_dim, y_dim, z_dim))):
print(x,y,z)
或
如果你不想用这种方式写地图:
for x, y, z in itertools.product(range(x_dim),
range(y_dim),
range(z_dim)):
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
使用 numpy mgrid,我们可以做:
points = np.ndarray((1,2,3))
xs, ys, zs = points.shape
for [x, y, z] in np.mgrid[0:xs, 0:ys, 0:zs].T.reshape(-1,len(points.shape)):
print(x,y,z)
假设我想遍历多维数组的索引。 我目前拥有的是:
import numpy as np
points = np.ndarray((1,2,3))
for x in range(points.shape[0]):
for y in range(points.shape[1]):
for z in range(points.shape[2]):
print(x,y,z)
我想减少嵌套并能够在一个简单的单行代码中循环遍历多维数组的所有索引。是不是也可以写成下面的形式?
points = np.ndarray((1,2,3))
for (x, y, z) in ?? :
print(x,y,z)
使用 iterools
:
import itertools
x_dim, y_dim, z_dim = points.shape
for x, y, z in itertools.product(*map(range, (x_dim, y_dim, z_dim))):
print(x,y,z)
或 如果你不想用这种方式写地图:
for x, y, z in itertools.product(range(x_dim),
range(y_dim),
range(z_dim)):
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
使用 numpy mgrid,我们可以做:
points = np.ndarray((1,2,3))
xs, ys, zs = points.shape
for [x, y, z] in np.mgrid[0:xs, 0:ys, 0:zs].T.reshape(-1,len(points.shape)):
print(x,y,z)