Kotlin 2D阵列逐列计算平均值



我有一个2D数组,我想按列计算平均值。例如:

[[1,2,3],[4,5,6]] -> [2.5,3.5,4.5]

在python中,我会简单地做这个

np.mean(array, axis=1)

我怎么能在科特林做到这一点?

Kotlin没有2D数组,因此不支持对2D数组的操作。假设我们有一个数组,并且我们知道每行的大小是例如3,我们可以使用以下公式获得平均值:

val arr = arrayOf(
arrayOf(1, 2, 3),
arrayOf(4, 5, 6),
)
val result = (0 until 3).map { col ->
arr.map { it[col] }.average()
}
println(result) // [2.5, 3.5, 4.5]

如果你经常执行这样的操作,那么你可以看看Multik,它是Kotlin的多维数组实现。

val list = arrayOf(arrayOf(1, 2, 3), arrayOf(4, 5, 6))
val result = list.first().mapIndexed { 
index, _ -> list.sumOf { it[index] }.div(list.size.toDouble())
}
println(result)   // [2.5, 3.5, 4.5]

这也适用于任何数量的子阵列:

val list = arrayOf(arrayOf(1, 2, 3), arrayOf(4, 5, 6), arrayOf(7, 8, 9))
...
println(result)   // [4.0, 5.0, 6.0]

假设所有行都包含相同数量的列,可以这样做:

val array = listOf(listOf(1, 2, 3), listOf(4, 5, 6))
val columns = array.first().size
val meanArray = List(columns) { col -> array.map { it[col] }.average() }
println(meanArray)

你自己试试

这里CCD_ 2创建元素数量等于CCD_ 3的列表。然后,对于每列colarray.map { it[col] }创建该列中的元素列表,该列表之后是对average()的调用,该调用仅计算列表元素的平均值。

只需从2D阵列中的每个阵列中获取第一个阵列,因为2D阵列本质上是阵列的阵列

var median = 0
for(k in array.indices) {
median += array[k][0]
}
median /= array.indices

最新更新