【问题标题】:ND4j INDArray value indexing and boolean operationND4j INDArray 值索引和布尔运算
【发布时间】:2021-08-23 18:33:35
【问题描述】:

这里是 numpy 代码:

import numpy as np

arr1 = np.array([[0, 1, np.nan], [3, np.nan, 5], [np.nan, 7, 8]])
arr2 = np.array([[np.nan, 7, 6], [5, np.nan, 3], [2, 1, np.nan]])

print(arr1)
print(arr2)

arr1 是: [[ 0. 1. 南] [ 3. 南 5.] [南 7. 8.]]]

arr2 是: [[南 7. 6.] [ 5. 南 3.] [2. 1. 南]]

然后我做:

idx1 = np.isnan(arr1)
idx2 = np.isnan(arr2)

idx = idx1 | idx2

arr1[idx] = -1
arr2[idx] = -1

print(arr1)
print(arr2)

arr1 变为: [[-1。 1.-1.] [3.-1。 5.] [-1。 7. -1.]]

arr2 变为: [[-1。 7.-1.] [5.-1。 3.] [-1。 1.-1.]]

然后我想用 scala 和 ND4j 重写这段代码:

import org.nd4j.linalg.factory.Nd4j

val arr1 = Nd4j.create(Array(Array(0, 1, Double.NaN), Array(3, Double.NaN, 5), Array(Double.NaN, 7, 8)))
val arr2 = Nd4j.create(Array(Array(Double.NaN, 7, 6), Array(5, Double.NaN, 3), Array(2, 1, Double.NaN)))

println(arr1)
println(arr2)

val idx1 = arr1.isNaN
val idx2 = arr2.isNaN

val idx = idx1 | idx2 // error

arr1.putWhereWithMask(idx, -1)
arr2.putWhereWithMask(idx, -1)

println(arr1)
println(arr2)

此代码未编译。如何修改它?谢谢!

【问题讨论】:

    标签: scala nd4j


    【解决方案1】:

    您可以为此使用 BooleanIndexing 类: https://github.com/eclipse/deeplearning4j/blob/master/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/indexing/BooleanIndexing.java

    这是一个使用 nan 的测试示例:

     INDArray array = Nd4j.create(new double[] {0, 1, 2, 3, Double.NaN, 5, 6, 7, 8, 9});
    int val = (int) Nd4j.getExecutioner().exec(new MatchCondition(array, Conditions.isNan()))
                    .getDouble(0);
    
    

    【讨论】:

      【解决方案2】:

      经过一番搜索和尝试,我找到了解决办法:

      import org.nd4j.linalg.factory.Nd4j
      
      val arr1 = Nd4j.create(Array(Array(0, 1, Double.NaN), Array(3, Double.NaN, 5), Array(Double.NaN, 7, 8)))
      val arr2 = Nd4j.create(Array(Array(Double.NaN, 7, 6), Array(5, Double.NaN, 3), Array(2, 1, Double.NaN)))
      
      println(arr1)
      println(arr2)
      
      val idx1 = arr1.isNaN
      val idx2 = arr2.isNaN
      
      val idx = Nd4j.createUninitialized(DataType.BOOL, idx1.shape():_*)
      
      Nd4j.exec(new Or(idx1, idx2, idx))
      
      val minusOnes = Nd4j.zerosLike(arr1).subi(1.0)
      
      val arr1_modified = Nd4j.where(idx, arr1, minusOnes)(0)
      val arr2_modified = Nd4j.where(idx, arr2, minusOnes)(0)
      
      println(arr1_modified)
      println(arr2_modified)
      

      其他解决方案表示赞赏。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 2014-02-20
        • 2010-09-23
        相关资源
        最近更新 更多