带where子句的numpy np.subtract对相同的数字给出不同的结果



我注意到np.subtract有一些奇怪的行为。

我的实际情况更加复杂,因为我用一个示例数组复制了类似的东西。我的python版本是3.8.5。

# create a 3x3 array of random integers 
a = np.random.randint(5, size=(3, 3))
#use np.subtract() to subtract 1 using where clause a != 0
np.subtract(a, 1, where=a!= 0)

对于np.subtract(a,1 where=a!=0)的每次连续调用,在where子句为False的位置会得到不同的结果。我是不恰当地使用了where子句,还是这里有什么问题?

样品:

a = np.array([[0, 4, 3],
[2, 2, 2],
[4, 0, 3]])
np.subtract(a, 1, where=a!= 0)

结果:

array([[1152921504606846976,                   3,                   2],
[                  1,                   1,                   1],
[                  3, 4616189618054758400,                   2]])

array([[1152921504606846976,                   3,                   2],
[                  1,                   1,                   1],
[                  3, 8387229874590130729,                   2]])

想要的是在where子句为False的元素中复制结果。所以在我的情况下,它们应该是0。

如果where掩码的某个元素为False,则不会为该元素计算ufunc。这些元素的输出中不会写入任何内容。这意味着输出元素是已经存在的,在这种情况下,这是未初始化的垃圾。引用ufuncwhere参数的文档:

请注意,如果创建了未初始化的返回数组,False的值将使这些值未初始化

如果要为假掩码元素复制a中的值,则可以将输出数组初始化为a:的副本

result = numpy.subtract(a, 1, where=a!=0, out=a.copy())

或者,由于您从a复制的值都是0,

result = numpy.subtract(a, 1, where=a!=0, out=numpy.zeros_like(a))

或者使用numpy.where(这是完全不同的东西(从aa-1:中选择元素

result = numpy.where(a==0, a, a-1)

最新更新