<p>这个问题的答案有点棘手,需要了解Python如何处理整数以及numpy如何强制类型。多谢@ali嫒m的评论!</p>
<p>假设64位整数,最大的可表示整数是<code>9,223,372,036,854,775,807</code>(参见示例<a href="https://en.wikipedia.org/wiki/Integer_(computer_science)#Common_integral_data_types" rel="noreferrer">Wikipedia</a>),大致是<code>10**19</code>。但是一旦超过这个值,Python就会返回到无限制整数表示(就像在您的例子中<code>10**44</code>)。但是这种无限精度的类型并没有得到NumPy的支持,所以结果将返回到<code>object</code>s,而这些<code>object</code>数组不支持所有(any?)ufuncs,比如<code>np.log10</code>。</p>
<p>解决方法很简单:将此大数转换为浮点数:</p>
<pre><code>>>> # Negative powers will result in floats: 44 -> -44, * instead of /
>>> np.array([10, 20]) * 10**-44
array([ 1.00000000e-43, 2.00000000e-43])
>>> # you could also make the base a float: 10 -> 10.
>>> np.array([10, 20]) / 10.**44
array([ 1.00000000e-43, 2.00000000e-43])
>>> # or make the exponent a float: 44 -> 44.
>>> np.array([10, 20]) / 10**44.
array([ 1.00000000e-43, 2.00000000e-43])
>>> # manually cast the result to a float
>>> np.array([10, 20]) / float(10**44)
array([ 1.00000000e-43, 2.00000000e-43])
>>> # not working, result is an object array which cannot be used for np.log10
>>> np.array([10, 20]) / (10**(44))
array([1e-43, 2e-43], dtype=object)
>>> # ^---------that's the problem!
</code></pre>
<p>您只需更改函数中的第三行:</p>
<pre><code>import numpy as np
def mass(FWHM, lumi):
s1 = FWHM / 1000
s2 = lumi * 10**-44 # changed line, using the first option.
s = s1**2 * s2**0.53
mass = np.log10(s) + 6.66
return mass
</code></pre>
<p>这至少适用于我的所有测试输入,例如:</p>
<pre><code>>>> mass(np.array([10., 20]), np.array([10., 20]))
array([-20.13 , -19.36839411])
</code></pre>