2017-04-24 80 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 I只是用:

 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] 

编辑:有一个更快的方法通过利用这样的事实,你给的例子中,该值到处都是比指数1时做到这一点:

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

这使得使用用数组索引的结果会返回索引数组的形状。

相关问题