我有以下代码:
val blueCount = sc.accumulator[Long](0)
val output = input.map { data =>
for (value <- data.getValues()) {
if (record.getEnum() == DataEnum.BLUE) {
blueCount += 1
println("Enum = BLUE : " + value.toString()
}
}
data
}.persist(StorageLevel.MEMORY_ONLY_SER)
output.saveAsTextFile("myOutput")
Run Code Online (Sandbox Code Playgroud)
然后blueCount不为零,但我没有println()输出!我在这里错过了什么吗?谢谢!
在Java 8中,Stream有一个方法减少:
T reduce(T identity, BinaryOperator<T> accumulator);
Run Code Online (Sandbox Code Playgroud)
累加器运算符是否允许修改其任一参数?我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素.
所以,举一个具体的例子,如果我们有
integers.reduce(0, Integer::sum);
Run Code Online (Sandbox Code Playgroud)
并假设一个Integer
可变的时刻,sum
可以通过向其添加(就地)第二个参数的值来修改其第一个参数吗?
我认为不是,但我也想要一个这个干扰导致问题的例子.
我正在寻找一个快速解决MATLAB的accumarray
numpy问题.的accumarray
累积,其属于同一索引的数组的元素.一个例子:
a = np.arange(1,11)
# array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
accmap = np.array([0,1,0,0,0,1,1,2,2,1])
Run Code Online (Sandbox Code Playgroud)
结果应该是
array([13, 25, 17])
Run Code Online (Sandbox Code Playgroud)
到目前为止我做了什么:
我已经accum
在这里的配方中尝试了这个功能很好但很慢.
accmap = np.repeat(np.arange(1000), 20)
a = np.random.randn(accmap.size)
%timeit accum(accmap, a, np.sum)
# 1 loops, best of 3: 293 ms per loop
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用这里应该更快工作的解决方案,但它无法正常工作:
accum_np(accmap, a)
# array([ 1., 2., 12., 13., 17., 10.])
Run Code Online (Sandbox Code Playgroud)
是否有内置的numpy功能可以像这样积累?还是其他任何建议?
我只是读一点关于HQ9 +编程语言(http://esolangs.org/wiki/HQ9, http://en.wikipedia.org/wiki/HQ9%2B和HTTP://www.cliff.biffle. org/esoterica/hq9plus.html),它告诉我一些所谓的'累加器',它可以递增,但不能被访问.另外,使用+
不会操纵结果:
H+H
Run Code Online (Sandbox Code Playgroud)
Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我这是如何工作的,这是做什么的,如果它甚至有意义吗?谢谢
该mapAndSum
代码块下面的所有方式结合功能map
和sum
(不去管另一个sum
是在主函数中应用,它只是用来使输出紧凑型).它map
是懒惰地计算的,而sum
使用累积参数计算.这个想法是,结果map
可以在没有完整列表的情况下被消费,并且(仅)之后sum
可以"免费"获得.main函数表示调用时我们遇到了无法反驳的模式问题mapAndSum
.让我解释一下这个问题.
根据Haskell标准,无可辩驳的模式示例let (xs, s) = mapAndSum ... in print xs >> print s
被翻译成
(\ v -> print (case v of { (xs, s) -> xs })
>> print (case v of { (xs, s) -> s }))
$ mapAndSum ...
Run Code Online (Sandbox Code Playgroud)
因此,两个print
调用都带有对整个对的引用,这导致整个列表保存在内存中.
我们(我的同事Toni Dietze和我)使用明确的case
陈述解决了这个问题(比较"坏"与"好2").顺便说一句,发现这一点花了我们相当多的时间..!
现在,我们不理解的是双重的:
为什么mapAndSum
首先工作?它还使用无可辩驳的模式,因此它也应该将整个列表保留在内存中,但显然不会.并且转换let
为a case
将使该函数表现为完全不受欢迎(到堆栈溢出的程度;没有双关语意图).
我们看了GHC生成的"核心"代码,但就我们所能解释的那样,它实际上包含了与let
上面相同的翻译.所以在这里没有任何线索,而是更多的混乱.
为什么"不好?" 关闭优化时工作,但打开优化时不工作? …
我想使用boost accumulators来计算作为向量的变量的统计信息.有一个简单的方法来做到这一点.我认为不可能使用最愚蠢的事情:
using namespace boost::accumulators;
//stuff...
accumulator_set<vector<double>, stats<tag::mean> > acc;
vector<double> some_vetor;
//stuff
some_vector = doStuff();
acc(some_vector);
Run Code Online (Sandbox Code Playgroud)
也许这很明显,但无论如何我都试过了.:P
我想要的是有一个累加器来计算一个向量,它是许多向量的分量的平均值.有一个简单的方法吗?
编辑:
我不知道我是否彻底清楚.我不想要这个:
for_each(vec.begin(), vec.end(),acc);
Run Code Online (Sandbox Code Playgroud)
这将计算给定矢量的条目的平均值.我需要的是不同的.我有一个将吐向量的函数:
vector<double> doSomething();
// this is a monte carlo simulation;
Run Code Online (Sandbox Code Playgroud)
我需要多次运行并计算这些向量的矢量平均值:
for(int i = 0; i < numberOfMCSteps; i++){
vec = doSomething();
acc(vec);
}
cout << mean(acc);
Run Code Online (Sandbox Code Playgroud)
我希望mean(acc)是一个向量本身,其entry [i]将是累积向量的条目[i]的平均值.
在Boost的文档中有关于此的暗示,但没有任何明确的.而我有点愚蠢.:P
我已经从4clojure.com解决了45个问题,我注意到我尝试使用递归和累加器解决一些问题的方式中反复出现问题.
我会试着解释一下我能做的最好的事情,最终得到一些非常好的解决方案,希望有些Clojurers会"得到"我没有得到的东西.
例如,问题34要求编写一个函数(不使用范围),将两个整数作为参数并创建一个范围(不使用范围).简单地说你做(... 1 7)然后你得到(1 2 3 4 5 6).
现在这个问题不是解决这个特殊问题.
如果我想使用递归和累加器来解决这个问题怎么办?
我的思维过程是这样的:
我需要编写一个带两个参数的函数,我从(fn [xy])开始
我需要递归,我需要跟踪一个列表,我将使用累加器,所以我在第一个函数中写了第二个函数,需要另外一个参数:
(fn [xy]
((fn g [xy acc] ...)x y'())
(显然我无法在SO上正确格式化Clojure代码!?)
在这里,我已经不确定我是否正确地执行了它:第一个函数必须使用两个整数参数(而不是我的调用)并且我不确定:如果我想使用累加器,我可以使用累加器而不创建嵌套函数?
然后我想连词,但我不能这样做:
(conj 0 1)
Run Code Online (Sandbox Code Playgroud)
所以我做了奇怪的事情,以确保我先得到一个序列,我最终得到这个:
(fn
[x y]
((fn g [x y acc] (if (= x y) y (conj (conj acc (g (inc x) y acc)) x)))
x
y
'()))
Run Code Online (Sandbox Code Playgroud)
但是这产生了这个:
(1 (2 (3 4)))
Run Code Online (Sandbox Code Playgroud)
而不是这个:
(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
所以我最终做了一个额外的压扁,它的工作原理,但它是完全丑陋的.
我开始理解一些事情,我甚至开始,在某些情况下,以更多的方式"思考",但我在编写解决方案时遇到了问题.
比如我在这里决定: …
我正在通过"现在学习Prolog"在线书籍来获取乐趣.
我正在尝试编写一个谓词,该谓词遍历列表的每个成员并使用累加器向其中添加一个谓词.我已经很容易做到了,没有尾递归.
addone([],[]).
addone([X|Xs],[Y|Ys]) :- Y is X+1, addone(Xs,Ys).
Run Code Online (Sandbox Code Playgroud)
但我已经读过,出于性能原因,最好避免这种类型的递归.这是真的?总是使用尾递归被认为是"好习惯"吗?是否值得努力使用累加器来养成良好的习惯?
我试图将此示例更改为使用累加器,但它会反转列表.我怎么能避免这个?
accAddOne([X|Xs],Acc,Result) :- Xnew is X+1, accAddOne(Xs,[Xnew|Acc],Result).
accAddOne([],A,A).
addone(List,Result) :- accAddOne(List,[],Result).
Run Code Online (Sandbox Code Playgroud) 我有一张像这样的桌子:
SELECT值FROM表;
value
1
3
13
1
5
Run Code Online (Sandbox Code Playgroud)
我想添加一个累加器列,以便我有这个结果:
value accumulated
1 1
3 4
13 17
1 18
5 23
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我想做什么真正的名字是什么?谢谢
当你调用reduce并传递一个函数和两个参数时,第一个参数可以被认为是一个累加器吗?
它总是一个累加器吗?
它有时是累加器吗?
我正在阅读一篇关于使用Clojure来解析大文件的博客文章并找到了这一行:
(reduce line-func line-acc (line-seq rdr))
Run Code Online (Sandbox Code Playgroud)
链接到博客条目:
http://lethain.com/reading-file-in-clojure/
怎么样简单:( 减少+ [1 2 3])?是否涉及累加器?
我把它问题归结为:"什么是累加器?"
但我还是想了解累加器和reduce函数之间的关系.所以对这些特定(相关)问题的任何答案都是最受欢迎的!