将元素插入到数组中,条件是最快的方式

时间:2017-04-24 22:25:07

标签: python numpy

    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,但却无法让它足够快地运行。

1 个答案:

答案 0 :(得分: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]

这利用了一个事实,即使用数组索引返回的结果是索引数组的形状。