2012-04-22 8 views
0

各要素が0からKまでの整数([0、K])である次元NのALLベクトルのセットを作成するためのエレガントな方法は何ですか?Python、ベクトルを作成するエレガントな方法

私の現在のコードは次のとおりです。

def nodes_init(n, k): 
    nodes = {} 
    e = np.identity(n) 
    nodes[tuple(np.zeros(n))] = 0 
    s = Set() 
    s.add(tuple(np.zeros(n))) 
    s_used = Set() 
    while len(s) != 0: 
     node = s.pop() 
     if node in s_used: 
      continue 
     s_used.add(node) 
     for i in xrange(len(e)): 
      temp = node + e[i] 
      temp = cap(temp, k) 
      temp = tuple(temp) 
      nodes[temp] = 0 
      if not temp in s_used: 
       s.add(temp) 
    return nodes 

def cap(t, k): 
    for i in xrange(len(t)): 
     if t[i] > k: 
      t[i] = k 
    return t 

と私はそれを好きではありません。辞書nodesの のキーが望ましいベクトルです。

+0

、なぜあなたはこれをしたいですか?あなたはK^Nベクトルに終わらないでしょうか? (たくさん) – Shep

+0

私は木で遊んでいます。私の場合はnとkでないので、コンピュータで扱うことができます – ashim

答えて

2

使用itertools

from itertools import product 

def nodes_iter(n, k): 
    """ returns generator (lazy iterator) rather than creating whole list """ 
    return product(range(k+1),repeat=n) 

使用例:好奇心のうち

for node in nodes_iter(3,1): 
    print node 


(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 
+0

'product'はキーワード引数' repeat'をとります。したがって、 'product(range(k + 1)、repeat = n)'が実行します。そして、「k」は包括的であることに注意してください。 'range(k)'ではなく 'range(k + 1)'です。 – Avaris

+0

私は、Avarisのコメント(そしてコンソール上でテストした後)に応じて回答を編集する自由を取った。 –

+0

@Roberto:編集してくれてありがとうございましたが、同時に編集していました – vartec

関連する問題