我正在尝试将python脚本转换为java。由于我对python不太熟悉,因此我无法理解此脚本中的条件。这是原始脚本:
import numpy as np
def inverse_generalized_anscombe(x, mu, sigma, gain=1.0):
test = np.maximum(x, 1.0)
exact_inverse = ( np.power(test/2.0, 2.0) +
1.0/4.0 * np.sqrt(3.0/2.0)*np.power(test, -1.0) -
11.0/8.0 * np.power(test, -2.0) +
5.0/8.0 * np.sqrt(3.0/2.0) * np.power(test, -3.0) -
1.0/8.0 - np.power(sigma, 2) )
exact_inverse = np.maximum(0.0, exact_inverse)
exact_inverse *= gain
exact_inverse += mu
exact_inverse[np.where(exact_inverse != exact_inverse)] = 0.0
return exact_inverse
我不理解的行是这一行:
exact_inverse[np.where(exact_inverse != exact_inverse)] = 0.0
据我了解,exact_inverse应该是单个值,而不是数组,那么为什么在它前面有一对方括号?方括号试图检查的情况是什么? exact_inverse != exact_inverse
的情况似乎总是false
,或者我在这里错过了什么。
可以找到原始脚本here
答案 0 :(得分:2)
首先(numpy.nan != numpy.nan) is True
,因此exact_inverse != exact_inverse
并非总是错误。
接下来,考虑一下:
>>> exact_inverse = 5
>>> exact_inverse += numpy.array([1,2]) # this may be 'mu', the same for 'gain'
>>> exact_inverse
array([6, 7]) # no longer an integer
此外,如果x
是一个数组,则:
>>> x = numpy.array([1,2,3])
>>> numpy.maximum(x, 1.0)
array([ 1., 2., 3.]) # that's an array!
然后,对数组和数字进行除法,乘法,加法等操作将导致按元素进行运算。