我有:
(def data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])
我想平均这些(按要素获得):
[3 6 5 5 6]
就像在MATLAB中一样:
mean([1 3 4 7 9; 7 6 3 2 7; 1 9 8 6 2])
使用Incanter我可以做到:
(map #(/ % (count m)) (apply plus data))
如果数据相当大(而且我有很多),还有更好的方法吗?
事先计算(count m)
是否有帮助?
事先defn
对#(/ % (count m))
有帮助吗?
答案 0 :(得分:7)
这是一个非常简洁的方法:
(def data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])
(defn average [coll]
(/ (reduce + coll) (count coll)))
(defn transpose [coll]
(apply map vector coll))
(map average (transpose data))
=> (3 6 5 5 6)
答案 1 :(得分:7)
截至2013年,我的建议是只使用core.matrix.stats导入所有这些功能:
(mean [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])
=> [3.0 6.0 5.0 5.0 6.0]
core.matrix.stats构建于core.matrix API之上,因此它也可用于其他更优化的向量和矩阵实现 - 如果您正在进行大量的重矩阵处理,这可能是更好的选择。
答案 2 :(得分:5)
在不知道如何使用任何咒语的情况下,您可以“从头开始”执行此操作。
(let [data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]]
num (count data)]
(apply map (fn [& items]
(/ (apply + items) num))
data))
;=> (3 6 5 5 6)