有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中二维整数数组与二维双数组的转换

我试图创建一个实用函数,以从二维整数数组中创建一个二维双精度数组(该数组是由deeplearning4j的KerasTokenizer的textsToSequences(String[]text)方法创建的)。我创建了下面的方法,但在第111行(doubles[i][j] = list.get(j);)继续获取NullPointerExceptions。如何更改方法或创建新方法来解决此问题

public static double[][] integerToDoubleArray(Integer[][] integers) {
        double[][] doubles = new double[integers.length][];
        for (int i = 0; i < integers.length; i++) {
            List<Integer> list = Arrays.asList(integers[i]);
            for (int j = 0; j < list.size(); j++) {
                doubles[i][j] = list.get(j);
            }
        }
        return doubles;
    }

我通过以下API使用以下方法调用它:https://deeplearning4j.org/api/latest/org/deeplearning4j/nn/modelimport/keras/preprocessing/text/KerasTokenizer.html#textsToSequences-java.lang.String:A-

private static double[][] encodeSequences(KerasTokenizer tokenizer, int length, ArrayList<String> sentences) {
        return integerToDoubleArray(tokenizer.textsToSequences(arraylistToArray(sentences)));
    }

共 (2) 个答案

  1. # 1 楼答案

    这可以解决你的问题。我看不出有任何理由在转换期间使用ArrayList

    public static double[][] integerToDoubleArray(Integer[][] integers) {
            
            //TODO: return empty double[][] array if integers 2-D array is empty
            
            double[][] doubles = new double[integers.length][integers[0].length];
            for (int i = 0; i < integers.length; i++) {
                for (int j = 0; j < integers[0].length; j++) {
                    doubles[i][j] = integers[i][j];
    
                }
            }
            return doubles;
        }
    
  2. # 2 楼答案

    您没有指定doubles的第二维度(它是一个双数组数组),也没有初始化它的每个元素,因此您得到了这个异常。只需将每一行初始化为一个新的双数组,其长度为该索引处整数数组的长度

    public static double[][] integerToDoubleArray(Integer[][] integers) {
        double[][] doubles = new double[integers.length][];
        for (int i = 0; i < integers.length; i++) {
            doubles[i] = new double[integers[i].length];
            List<Integer> list = Arrays.asList(integers[i]);
            System.out.println(list);
            for (int j = 0; j < list.size(); j++) {
                doubles[i][j] = list.get(j);
            }
        }
        return doubles;
    }
    

    应该注意的是,您不需要将二维整数数组的每一行转换为List,因为您可以简单地使用integers[i][j]访问行i和列j处的元素Demo

    public static double[][] integerToDoubleArray(Integer[][] integers) {
        double[][] doubles = new double[integers.length][];
        for (int i = 0; i < integers.length; i++) {
            doubles[i] = new double[integers[i].length];
            for (int j = 0; j < integers[i].length; j++) {
                doubles[i][j] = integers[i][j];
            }
        }
        return doubles;
    }