我需要将数组(NIR(与标量(f(相乘,但保留一些满足特定条件的值不变。
我尝试了以下方法:
NIR_f = np.multiply(NIR,f,where=NIR!=-28672.0)
要检查我所做的:
i,j=1119,753
NIR[i][j],NIR_f[i][j]
我得到了这个:
(-28672.0, 10058.0)
假设两个结果应该相同!在该位置,不满足条件,因此值应保持不变。
我是否错误地使用了"位置"选项?
没有你的数组,或者一个更小的替代品,我无法完全复制你的问题。 但可能存在 2 个问题
-
浮点测试不精确,因此它可能匹配一个 -28672.0,而不是另一个。
-
remain intact
假设是棘手的。leave the value in the output alone
,但它最初是什么,0 或NIR
值。
使用整数数组来避免浮点问题:
In [20]: arr = np.arange(12).reshape(3,4)
In [21]: arr
Out[21]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [22]: np.multiply(arr, 10, where=arr!=10)
Out[22]:
array([[ 0, 10, 20, 30],
[ 40, 50, 60, 70],
[ 80, 90, 481036337249, 110]])
In [24]: np.multiply(arr, 10, where=arr!=10)
Out[24]:
array([[ 0, 10, 20, 30],
[ 40, 50, 60, 70],
[ 80, 90, 0, 110]])
arr[2,2]
是随机的。 实际上,它从一个具有正确形状和 dtype 的np.empty
数组开始,并用乘法填充除该值之外的所有值。 为了正确使用where
,我们还需要指定一个out
参数。
In [25]: out = np.full(arr.shape,-1)
In [26]: out
Out[26]:
array([[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]])
In [27]: np.multiply(arr, 10, where=arr!=10, out=out)
Out[27]:
array([[ 0, 10, 20, 30],
[ 40, 50, 60, 70],
[ 80, 90, -1, 110]])
不精确的浮点数问题经常出现,我不会试图说明这一点。