将特定迭代次数映射到n维列表/数组

时间:2016-05-13 04:00:20

标签: python mapping

我知道有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维数组中的位置?而且,我的目标不是写上面那样的另一个函数。

1 个答案:

答案 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)