gpt4 book ai didi

java - ND4J 数组及其形状 : getting data into a list

转载 作者:行者123 更新时间:2023-12-02 02:25:35 24 4
gpt4 key购买 nike

考虑以下代码,它使用 ND4J library创建 the "moons" test data set 的更简单版本:

val n = 100
val n1: Int = n/2
val n2: Int = n-n1
val outerX = Nd4j.getExecutioner.execAndReturn(new Cos(Nd4j.linspace(0, Math.PI, n1)))
val outerY = Nd4j.getExecutioner.execAndReturn(new Sin(Nd4j.linspace(0, Math.PI, n1)))
val innerX = Nd4j.getExecutioner.execAndReturn(new Cos(Nd4j.linspace(0, Math.PI, n2))).mul(-1).add(1)
val innerY = Nd4j.getExecutioner.execAndReturn(new Sin(Nd4j.linspace(0, Math.PI, n2))).mul(-1).add(1)
val X: INDArray = Nd4j.vstack(
Nd4j.concat(1, outerX, innerX), // 1 x n
Nd4j.concat(1, outerY, innerY) // 1 x n
) // 2 x n
val y: INDArray = Nd4j.hstack(
Nd4j.zeros(n1), // 1 x n1
Nd4j.ones(n2) // 1 x n2
) // 1 x n
println(s"# y shape: ${y.shape().toList}") // 1x100
println(s"# y data length: ${y.data().length()}") // 100
println(s"# X shape: ${X.shape().toList}") // 2x100
println(s"# X row 0 shape: ${X.getRow(0).shape().toList}") // 1x100
println(s"# X row 1 shape: ${X.getRow(1).shape().toList}") // 1x100
println(s"# X row 0 data length: ${X.getRow(0).data().length()}") // 200 <- !
println(s"# X row 1 data length: ${X.getRow(1).data().length()}") // 100

倒数第二行,X.getRow(0).data().length()令人惊讶的是,200 而不是 100。经检查,这是因为 data() 返回的结构包含整个矩阵,即连接的两行。

如何将 X 矩阵的实际第一行放入 Java(或 Scala)List ?我可以只获取 200 个元素的“第一行”的前 100 项,但这看起来不太优雅。

最佳答案

.data() 为您提供一条直线。请参阅:http://nd4j.org/tensor

数组的形状只是底层数据缓冲区的 View 。如果没有充分的理由,我通常不建议您做您想做的事情。所有数据都存储在堆外。那个副本很贵。

在堆上不利于进行任何类型的数学运算。这里唯一的用例是集成。我建议尽可能直接对数组进行操作。从序列化到索引的一切都会为您处理。

如果您确实需要它进行某种集成,请使用 Guava ,您可以在一行中完成:Doubles.asList(arr.data().dup().asDouble());

其中 arr 是要操作的 ndarray。

关于java - ND4J 数组及其形状 : getting data into a list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839617/

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