from itertools import product
def ndrange(start, stop=None, step=None):
if stop is None:
stop = start
start = (0,) * len(stop)
if step is None:
step = (1,) * len(start)
assert len(start) == len(stop) == len(step)
for index in product(*map(range, start, stop, step)):
yield index
字符串 示例如下:
In [7]: for index in ndrange((1,2,3), (10,20,30), step=(5,10,15)):
...: print(index)
...:
(1, 2, 3)
(1, 2, 18)
(1, 12, 3)
(1, 12, 18)
(6, 2, 3)
(6, 2, 18)
(6, 12, 3)
(6, 12, 18)
def ndrange_array(start, stop=None, step=None):
"""
Like np.ndindex, but accepts start/stop/step instead of
assuming that start is always (0,0,0) and step is (1,1,1),
and returns an array instead of an iterator.
"""
start = np.asarray(start)
if stop is None:
stop = start
start = (0,) * len(stop)
if step is None:
step = 1
def ndindex(shape):
"""Like np.ndindex, but returns ndarray"""
return np.indices(shape).reshape(len(shape), -1).transpose()
shape = (stop - start + step - 1) // step
return start + step * ndindex(shape)
7条答案
按热度按时间jdgnovmf1#
在numpy中是
numpy.ndindex
。再看看numpy.ndenumerate
。例如:
字符串
这产生:
型
mxg2im7a2#
可以使用
itertools.product()
:字符串
如果你想把它扩展到一个10维的循环或类似的荒谬的东西,那么多个重复的
xrange()
语句可以这样表达:型
它循环十个变量,从
(0,0,0,0,0,0,0,0,0,0)
到(2,2,2,2,2,2,2,2,2,2)
。总的来说,
itertools
是一个非常棒的模块。同样地,regexp比“普通”字符串方法更具表现力,itertools
是一种非常优雅的表达复杂循环的方法。You owe it to yourself to read theitertools
module documentation.它会让你的生活更有趣。wj8zmpe13#
实际上有一个简单的语法。你只需要有两个
for
:字符串
mrwjdhj34#
这是两个列表的笛卡尔乘积,因此:
字符串
给出以下输出:
型
g6ll5ycj5#
您可以从
itertools
模块使用product
。字符串
uyto3xhc6#
我想看看
numpy.meshgrid
:http://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.meshgrid.html
这将为您提供网格/栅格中每个位置的X和Y栅格值。然后你可以这样做:
字符串
或者是
型
ekqde3dh7#
ndindex()
不是range()
的ND等价物(尽管这里有一些其他的答案)。
它适用于您的简单示例,但不允许使用任意
start
、stop
和step
参数。它只接受stop
,并将start
硬编码为(0,0,...)
,将step
硬编码为(1,1,...)
。下面是一个更像内置
range()
函数的实现。也就是说,它允许任意start
/stop
/step
参数,但它适用于 * 元组 * 而不仅仅是整数。像内置的range()
一样,它返回一个可迭代对象。字符串
示例如下:
型
numpy用户
如果您的代码是基于numpy的,那么直接使用
ndarray
对象可能比使用元组的可迭代对象更方便。它也可能更快。如果您计划将结果转换为ndarray*,则以下实现比使用上述 * 更快。型