关于两个列表的操作以索引二维数组

时间:2017-09-20 16:40:48

标签: python arrays list

代码:

myfun <- function(V, target) {
                V <- sort(V)
                mincombs <- min(which(cumsum(V) > target))
                Combs <- combn(V, mincombs)
                ans <- mapply(function(x,y) ifelse(y > 0, paste0(paste0(Combs[1:y,x], collapse="+"), "=", target), NA), 1:ncol(Combs), apply(Combs, 2, function(I) which(cumsum(I) == target)))
                ans <- unlist(ans[lengths(ans) > 0])
                return(ans)
         }

myfun(V = c(3,9,8,4,5,7,10), target = 15)
myfun(V = c(3,9,8,4,5,7,10,12,4,32),target = 20)

最后,这应该给出一个数组

import numpy as np
a = np.array((1,1,1,1,2))
b = np.array((2,2,2,2,1))
g = np.zeros((3,3),np.int32)
g[a,b] += 1

即。 g [1,2]增加4次,g [2,1]增​​加一次,但它给出了

array([[0, 0, 0],
       [0, 0, 4],
       [0, 1, 0]])

我不想使用循环的原因是因为我认为矢量化可以加速计算。我有两个大集array([[0, 0, 0], [0, 0, 1], [0, 1, 0]]) a。但是我不确定这个操作是否可以利用Python的矢量化机制的性能。而且我也不确定我是否理解这种操作。我不知道在谷歌中搜索哪些关键词,所以我在这里提出问题。

如果有人能帮我理解,那就更好了。

1 个答案:

答案 0 :(得分:1)

这是NumPy ufuncs at method的用途:

numpy.add.at(g, (a, b), 1)

g[a, b] += 1会执行

temp = g[a, b]
temp += 1
g[a, b] = temp

创建一个包含4份g[1, 2]副本的临时数组,分别递增每个副本,并将每个副本分配回g[1, 2](赋值相互重叠)。

numpy.add.at(g, (a, b), 1)会直接在g数组上执行操作,因此它会增加g[1, 2] 4次,而不是每次增加4个副本。