代码:
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的矢量化机制的性能。而且我也不确定我是否理解这种操作。我不知道在谷歌中搜索哪些关键词,所以我在这里提出问题。
如果有人能帮我理解,那就更好了。
答案 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个副本。