将二维数组列表转换为二维浮点数组


ArrayList<ArrayList<Float>> lists = new ArrayList<ArrayList<Float>>();

这是我正在使用的数组列表。 我试过这个:

float[][] trainingData = lists.stream()
.map(l -> l.stream()
.mapToFloat(Float::parseFloat)
.toArray())
.toArray(float[][]::new);

我收到此错误:

方法 mapToFloat(Float::p arseFloat( 未定义流类型

我必须将此二维数组列表转换为二维浮点数组。

首先,您的代码不起作用的原因是因为Java API中没有这样的方法mapToFloat,但最重要的是没有FloatStream

如果您想通过流完成此操作,您的选择非常有限:

  1. 累积到Float[][]而不是float[][],这可能并不理想,因为当您想稍后在应用程序中执行一些计算时,它涉及装箱和解箱瓶颈。

这可以通过以下方式实现:

Float[][] trainingData = lists.stream()
.map(l -> l.toArray(new Float[0]))
.toArray(Float[][]::new);
  1. 首先使用List<List<Double>>而不是List<List<Float>>来表示训练数据,然后您可以在需要时将其转换为double[][]

这可以通过以下方式实现:

double[][] trainingData = lists.stream()
.map(l -> l.stream().mapToDouble(Double::doubleValue).toArray())
.toArray(double[][]::new);

但是,如果您由于任何原因无法更改初始数据类型,那么您仍然可以隐蔽到double[][]

这可以通过以下方式实现:

double[][] trainingData = lists.stream()
.map(l -> l.stream().mapToDouble(Float::doubleValue).toArray())
.toArray(double[][]::new);
  1. 定义您自己的Collector,您应该能够通过一些研究在网站中找到。

最终,您可能最好在这里使用命令式方法,即for循环。

试试这个:

Float[][] trainingData = lists
.stream().map(lst -> lst.stream().toArray(Float[]::new))
.toArray(Float[][]::new);

如果你需要基元数组,我能想到的唯一方法是你可能已经知道的(但为了完整性,我包括在内(。

float[][] trainingData = new float[lists.size()][];
for (int i = 0; i < lists.size(); i++) {
List<Float> innerList = lists.get(i);
float[] temp = trainingData[i] = new float[innerList.size()];
for (int k = 0; k < temp.length; k++) {
temp[k] = innerList.get(k);
}
}
for(float[] v : trainingData) {
System.out.println(Arrays.toString(v));
}

两者都打印

[10.0, 10.2]
[20.4, 2.6]

对于浮点数,流没有好方法,您可以通过这种方式获得 2D 双数组

double[][] trainingData = lists.stream()
.map(l -> l.stream().mapToDouble(f -> f.doubleValue()).toArray()).toArray(double[][]::new);

最新更新