【问题标题】:Is there an argsort function in java? [closed]java中有argsort函数吗? [关闭]
【发布时间】:2015-07-16 08:05:08
【问题描述】:

我想在数组或 arraylist 或 Java 中的其他数据结构上使用 argsort 函数,但我在文档中没有找到 argsort 函数。我知道Collections 类上有一个sort 方法,但没有任何argsort 方法。是否有任何类已经实现了argsort 方法?

【问题讨论】:

  • 我知道 argsort 做什么,它返回对数组进行排序的索引。我只是在寻找一个已经实现了这个方法的类
  • 我也可以用java写这个方法,不是很困难,但是我一直在找一个实现它的类,比如sort方法……

标签: java arrays sorting


【解决方案1】:

我找到了这门课,希望是你想要的:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

public final class ArrayUtils {
    public static int[] argsort(final float[] a) {
        return argsort(a, true);
    }

    public static int[] argsort(final float[] a, final boolean ascending) {
        Integer[] indexes = new Integer[a.length];
        for (int i = 0; i < indexes.length; i++) {
            indexes[i] = i;
        }
        Arrays.sort(indexes, new Comparator<Integer>() {
            @Override
            public int compare(final Integer i1, final Integer i2) {
                return (ascending ? 1 : -1) * Float.compare(a[i1], a[i2]);
            }
        });
        return asArray(indexes);
    }

    public static <T extends Number> int[] asArray(final T... a) {
        int[] b = new int[a.length];
        for (int i = 0; i < b.length; i++) {
            b[i] = a[i].intValue();
        }
        return b;
    }

    public static double[] castOf(final float[] x) {
        double[] y = new double[x.length];
        for (int i = 0; i < y.length; i++) {
            y[i] = x[i];
        }
        return y;
    }

    public static int[] castOf(final long[] original) {
        return castOf(original, original.length);
    }

    public static int[] castOf(final long[] original, final int newLength) {
        int[] cast = new int[newLength];
        int length = Math.min(cast.length, original.length);
        for (int i = 0; i < length; i++) {
            long o = original[i];
            if (o < Integer.MIN_VALUE || o > Integer.MAX_VALUE) {
                throw new IllegalArgumentException();
            }
            cast[i] = (int) o;
        }
        return cast;
    }

    public static float[][] copyOf(final float[][] x, final int newLength) {
        float[][] y = new float[newLength][];
        for (int i = 0; i < y.length; i++) {
            if (x[i] != null) {
                y[i] = Arrays.copyOf(x[i], x[i].length);
            }
        }
        return y;
    }

    /**
     * Assigns a random value to each element of the specified array of doubles.
     */
    public static void fillRandom(final double[] x, final Random rng) {
        for (int i = 0; i < x.length; i++) {
            x[i] = rng.nextDouble();
        }
    }

    private ArrayUtils() {
    }
}

链接: Code

【讨论】:

  • 我已经找到了(在问我的问题之前我也在网上做了一些研究),但我想知道为什么没有任何类使用这个 argsort 方法。例如,它存在于 Python numpy 中...
  • @fonfonx 是的,我知道,但在 Java 中似乎不是这样:D 改用这个。哦,这个问题现在回答了吗?或者我们还应该寻找它吗? :D
  • 能否只添加代码的相关部分并稍微解释一下。粘贴不是你写的代码不是答案。
  • @Haketo 我从来没有说过我写了这段代码,我不明白他真正想要什么,所以我把这个贴给他并添加了一个指向原始网站的链接
  • 放轻松,我只是想知道是否有一个可以使用 argsort 方法导入的类,就像我写 import java.util.Arrays;Arrays.sort(...) 一样,但似乎有没有Arrays.argsort(...)。不过没关系,我写了一些代码来实现它,但不写它会更容易......
【解决方案2】:

截至 2017 年,您可以找到 argsort function in the ND4J library(这可能是最接近 numpy 的 Java 等价物)。它没有进入 2017 年的 0.9.1 版本,但它看起来好像会出现在即将发布的 0.9.2 版本中。该代码实际上是从 JetStream 复制到他们的答案中的 array4j 代码派生的。 array4j 现在似乎已被放弃,因此一旦 argsort 发布,ND4J 可能会更受欢迎。一旦 0.9.2 发布,您就可以从 Maven Central repository 安装它。

顺便说一句,您在对 JetStream 的回答的评论中提到

我想知道为什么这个 argsort 方法没有任何类。例如,它存在于 Python numpy 中...

这不是一个公平的比较,因为 numpy 不是 Python 标准库的一部分,就像 ND4J 不属于 Java 一样。两种语言都没有在标准库中包含 argsort,并且都可以在第三方库中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2020-02-16
    • 2015-09-29
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多