2017-04-24 7 views
0
import numpy as np 
    from itertools import product 


    N = 3 
    P = 13 
    A = np.random.random_sample((P, N)) 
    heh = product(range(1,4), repeat=13) 
    mymat = np.array([letters for letters in heh], dtype=np.float) 


    for i in range(0,len(mymat)): 
    for j in range(0,(mymat.shape[1])): 
     if(mymat[i,j] == 1): 
      mymat[i,j] = A[j, 0] 
     if(mymat[i,j] == 2): 
      mymat[i,j] = A[j, 1] 
     if(mymat[i,j] == 3): 
      mymat[i, j] = A[j, 2] 

ネストしたforループは最適ではなく、if文はおそらくほとんど悪いことがわかります。 私は、行インデックスに 'i'の代わりに ':'を使用しています。また、試してみました:条件に最も速い条件で要素を配列に挿入する

mymat[mymat[:,i]==1] = A[i,0] 

それは私がちょうど使用Rに、しかし動作しませんでした:

 a <- letters[1:3] 
     eg <- expand.grid(a,a,a,a,a,a,a,a,a,a,a,a,a) 

     for (i in 1:ncol(eg)) { 
     eg[,i] <- as.character(eg[,i]) 
     eg[,i][eg[,i] == "a"] = mat[i,1] 
     eg[,i][eg[,i] == "b"] = mat[i,2] 
     eg[,i][eg[,i] == "c"] = mat[i,3] 
     eg[,i] <- as.numeric(eg[,i]) 
     } 

は、Pythonにそれを翻訳しようとしてきたが、ちょうどそれが十分に速く動作させることはできません。

+0

入力の例と出力の例を明確にすることができますか(問題の簡略化されたバージョンを使用してください)。これは間違いなくnumpyで非常に扱いやすいもののようですが、私はその質問をあまり理解していません... – isosceleswheel

答えて

1

ブロードキャストでこれを行うには、whereステートメントを使用します。例えば:

for col, val in enumerate([1, 2, 3]): 
    i, j = np.where(mymat == val) 
    mymat[i, j] = A[j, col] 

編集:

mymat = A[np.arange(mymat.shape[1]), mymat.astype(int) - 1] 

これは作る:あなたが与えた例の中に、値がどこでもインデックスより1大きいという事実を利用することによってこれを行うためにも、より高速な方法があります配列によるインデックス付けが、インデックス配列の形状である結果を返すという事実の使用。