2016-05-13 4 views
0

私はループのためにitertools.productがあることを知っていますが、それをもたらす反復数が与えられればn空間に任意の座標を返すようなものを書きたいと思っていましたループで。私はすでに似たようなものを書いています。特定の反復数を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を使用しようとしていましたが、役に立たないので、私は立ち往生しています。例えば、上記の関数を反復数98000の軸番号[6, 14, 9, 13, 17](つまり5次元配列)の配列Aで実行すると、座標は(3, 7, 2, 5, 12)となります。これを行うにはどうすればよいですか?特定の反復番号をn次元配列のその位置にマップしますか?そして、私の目標は、上記のような別の関数を書くことではありません。

+0

私はあなたの現在のソリューションであなたが不幸になり、正しくか理解I'amわかりませんか?それはスピードですか?それはコードの長さですか(できるだけ多くの組み込み関数を使用する方がいいですか?)あなたはそれを反復するために巨大なタプルを作成して格納しているのですか?1で1を値下げし、それらを忘れるイテレータを好むでしょうか? – Julien

+0

@JulienBernuそれほどスピードはあまりありませんが、この問題のために1ライナーが必要だと思っていますが、私はそれについて考えることはできません。 – bjd2385

答えて

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) 
関連する問題