gpt4 book ai didi

arrays - 在二维数组中查找最大值 "column-wise"

转载 作者:行者123 更新时间:2023-12-01 13:54:03 28 4
gpt4 key购买 nike

假设我有一个二维数组,例如像这样:

val A1 = Array(Array(4,0,0,0),Array(3),Array(3,4,40,1),Array(50,2))

现在我想在每个位置拥有最多的项目。

如果我将上面的数组写成矩阵形式,那么“按列”最大值的意思就很明显了:

4  0  0 0
3
3 4 40 1
50 2
----------
50 4 40 1 (result)

所以这种情况下的答案是Array(50,4,40,1)(空值将被忽略)。

我可以这样做:

A1.foldLeft(A1.head)( (x1, x2) =>
x1.padTo(x2.length, Int.MinValue).zip(x2.padTo(x1.length,Int.MinValue)).
map { pair => pair._1 max pair._2 }
)

但不知何故,对于这样一个简单的事情来说,这感觉很硬核。所以我希望有一种更简单的方法来做到这一点。

也许有

1) 一些函数可以直接执行此操作?

2) 执行此“使用默认值压缩”的一些方法:x1.padTo(x2.length, Int.MinValue).zip(x2.padTo(x1.length,Int.MinValue))更好?

3) 还有其他改进方法吗?

最佳答案

使用.tranpose获取Array[Array[Int]]的“列”,然后调用.map(_.max) 获取所有这些的最大值:

scala> val A1 = Array(Array(4,0,0,0),Array(3),Array(3,4,40,1),Array(50,2))
A1: Array[Array[Int]] = Array(Array(4, 0, 0, 0), Array(3), Array(3, 4, 40, 1), Array(50, 2))

scala> A1.transpose
res5: Array[Array[Int]] = Array(Array(4, 3, 3, 50), Array(0, 4, 2), Array(0, 40), Array(0, 1))

scala> A1.transpose.map(_.max)
res6: Array[Int] = Array(50, 4, 40, 1)

编辑:如果 Array[Array[T]] 中后面遇到的 Array 比第一个长,.tranpose 可能会抛出异常:

scala> Array(Array(1,2,3), Array(1,2,3,4)).transpose
java.lang.ArrayIndexOutOfBoundsException: 3
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1$$anonfun$apply$1.apply(ArrayOps.scala:102)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1$$anonfun$apply$1.apply(ArrayOps.scala:101)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofInt.foreach(ArrayOps.scala:234)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1.apply(ArrayOps.scala:101)
at scala.collection.mutable.ArrayOps$$anonfun$transpose$1.apply(ArrayOps.scala:99)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.mutable.ArrayOps$class.transpose(ArrayOps.scala:99)
at scala.collection.mutable.ArrayOps$ofRef.transpose(ArrayOps.scala:186)
... 32 elided

scala> Array(Array(1,2,3,4), Array(1,2,3)).transpose
res5: Array[Array[Int]] = Array(Array(1, 1), Array(2, 2), Array(3, 3), Array(4))

如果您的情况可能发生这种情况,您始终可以按内部数组长度(降序)对外部数组进行排序:

scala> Array(Array(1,2,3), Array(1,2,3,4)).sortBy(-_.length).transpose
res6: Array[Array[Int]] = Array(Array(1, 1), Array(2, 2), Array(3, 3), Array(4))

关于arrays - 在二维数组中查找最大值 "column-wise",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309829/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com