问题描述
这是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,6],[5,3],[2,np.nan]])
print(arr1)
print(arr2)
arr1 是: [[0.1.南] [ 3. 南 5.] [南 7. 8.]]
arr2 是: [[南 7. 6.] [ 5. 南 3.] [ 2. 1. nan]]
然后我做:
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.]]
然后我想使用带有 ND4j 的 Scala 重写此代码:
import org.nd4j.linalg.factory.Nd4j
val arr1 = Nd4j.create(Array(Array(0,Double.NaN),Array(3,Double.NaN,5),Array(Double.NaN,8)))
val arr2 = Nd4j.create(Array(Array(Double.NaN,6),Array(5,3),Array(2,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)
解决方法
您可以为此使用 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);
,
经过多次搜索和尝试,我找到了一个解决方案:
import org.nd4j.linalg.factory.Nd4j
val arr1 = Nd4j.create(Array(Array(0,Double.NaN),Array(3,5),Array(Double.NaN,8)))
val arr2 = Nd4j.create(Array(Array(Double.NaN,6),Array(5,3),Array(2,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)
其他解决方案表示赞赏。谢谢!