我有一个二维数组,表示数据的列和行。我需要将列和行相加,但我需要从新的“summary”行中总计。
数据(6x5阵列)
[1, 0, 3, 0, 0],
[0, 4, 0, 0, 4],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
所以结果应该是7x6数组
[1, 0, 3, 0, 0, 4],
[0, 4, 0, 0, 4, 8],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[1, 4, 3, 0, 4, 12]
我知道我可以对每一列求和,并通过
在我的二维数组中添加一行# Sum the columns, add additional one row for summary
a << a.transpose.map{|x| x.reduce(:+)}
但如何添加其他列
答案 0 :(得分:4)
a.map! {|row| row + [row.reduce(:+)]}
map!获取数组的每个元素,将其传递给块并用该块返回的任何内容替换该元素。因此,既然我们在二维数组上调用它,row
将是一个1d数组 - 原始数组的行。
然后我用该行的reduce(:+)
计算总和。然后我需要将它追加到那一行。我在这里做的是将sum的结果包装成一个数组,然后使用+来连接这两个数组。
我本可以这样做:
a.map! {|row| row << row.reduce(:+) }
答案 1 :(得分:0)
当我问这个问题时,我想出了一个解决方案,但我想知道是否有更好的方法。
我的解决方案
# Sum the rows (including the new summary row)
row_sum = a.map{|x| x.reduce(:+)}
# transpose the original array, add the summary column as a new row
c = a.transpose << row_sum
# transpose it back to the original view, now we have both summary of rows and columns
c.tranpose
更新
感谢Jakub Hampl
,这是我的新答案# Create the summary column (row totals), update the array
a.map! {|r| r + [r.reduce(:+)]}
# Create the summary row (column totals)
a.transpose.map{|x| x + [x.reduce(:+)]}