2

Here is the numpy code:

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 is: [[ 0. 1. nan] [ 3. nan 5.] [nan 7. 8.]]

arr2 is: [[nan 7. 6.] [ 5. nan 3.] [ 2. 1. nan]]

Then I do:

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

idx = idx1 | idx2

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

print(arr1)
print(arr2)

arr1 becomes: [[-1. 1. -1.] [ 3. -1. 5.] [-1. 7. -1.]]

arr2 becomes: [[-1. 7. -1.] [ 5. -1. 3.] [-1. 1. -1.]]

Then I want to rewrite this code using scala with 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)

This code is not compiled. How to modify it? Thanks!

xiagao1982
  • 1,077
  • 1
  • 13
  • 25

2 Answers2

0

You can use the BooleanIndexing class for this: https://github.com/eclipse/deeplearning4j/blob/master/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/indexing/BooleanIndexing.java

Here's an example from the tests that uses 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);

Adam Gibson
  • 3,055
  • 1
  • 10
  • 12
0

After searching and trying a lot, I found a solution:

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)

Other solutions are appreciated. Thanks!

xiagao1982
  • 1,077
  • 1
  • 13
  • 25