我注意到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
(这是完全不同的东西(从a
或a-1
:中选择元素
result = numpy.where(a==0, a, a-1)