首页 > 解决方案 > 如何将 3d 整数数组减少为二维?

问题描述

我有一个 3d 整数数组,我想通过计算沿第三维的最大值将其减少到二维。

我本质上是numpy.amax(array, axis=3)在寻找java。我也试过自己实现这个功能,但我的代码很慢。有谁知道如何在java中有效地执行此操作?

标签: javaarraysmultidimensional-arraymaxgrouping

解决方案


您可以迭代这个 3d 数组,其中每个元素是一个 2d 数组⇒ 迭代 2d 数组,其中每个元素是一个 1d 数组 ⇒ 并获得 1d 数组的最大值。为此,您可以使用Stream.max(Comparator)方法:

Integer[][][] arr3d = {
        {{10, 11, 12}, {13, 14, 15}, {16, 17, 18}},
        {{19, 20, 21}, {22, 23, 24}, {25, 26, 27}},
        {{28, 29, 30}, {31, 32, 33}, {34, 35, 36}}};
Integer[][] result = Arrays.stream(arr3d).map(arr2d ->
        Arrays.stream(arr2d).map(arr1d ->
                Arrays.stream(arr1d)
                        .max(Comparator.comparingInt(Integer::intValue))
                        .orElse(null))
                .toArray(Integer[]::new))
        .toArray(Integer[][]::new);
Arrays.stream(result).map(Arrays::toString).forEach(System.out::println);
// [12, 15, 18]
// [21, 24, 27]
// [30, 33, 36]

或者,如果您有一个 3d 基元数组int[][][],您可以使用IntStream.max()方法:

int[][] result = Arrays.stream(arr3d).map(arr2d ->
        Arrays.stream(arr2d).mapToInt(arr1d ->
                Arrays.stream(arr1d)
                        .max()
                        .orElse(0))
                .toArray())
        .toArray(int[][]::new);

另请参阅:使用预定义的 java 方法查找数组中的最大数


推荐阅读