我知道有itertools.product
for循环,但是我想写一些会在n空间中返回任意坐标的东西,给定迭代次数可以在循环中产生它。我已经写了类似的东西,即
def clock(iteration_number, axis_lengths):
dimension=len(axis_lengths)
coordinate = []
for i in range(dimension):
s = axis_lengths[dimension-i-1:dimension-i][0]
g = iteration_number % s
iteration_number /= s
coordinate += [g]
return tuple(reversed(coordinate))
但是我希望在内置函数divmod
(或其他)的帮助下,它可以被压缩为列表理解;我一直在尝试使用lambda
函数和map
,但无济于事,所以我被卡住了。例如,对于迭代编号为A
的轴长度为[6, 14, 9, 13, 17]
(即5维数组)的数组98000
运行上述函数会得到坐标(3, 7, 2, 5, 12)
。我该怎么做,即将特定的迭代次数映射到n维数组中的位置?而且,我的目标不是写上面那样的另一个函数。
答案 0 :(得分:0)
我不确定您提供的示例(您的代码会产生与您引用的结果不同的结果)。但是用于执行相同操作的内置单行程是np.unravel_index
:
import numpy as np
import operator
def product(iterable):
return reduce(operator.mul, iterable)
def clock_1(iteration_number, axis_lengths):
dimension=len(axis_lengths)
coordinate = []
for i in range(dimension):
s = axis_lengths[dimension-i-1:dimension-i][0]
g = iteration_number % s
iteration_number //= s
coordinate += [g]
return tuple(reversed(coordinate))
def clock_2(iteration_number, axis_lengths):
return np.unravel_index(iteration_number % product(axis_lengths), axis_lengths)
print "clock_1:", clock_1(98000, (6,14,9,3,17))
print "clock_2:", clock_2(98000, (6,14,9,3,17))
clock_1: (3, 3, 4, 1, 12)
clock_2: (3, 3, 4, 1, 12)