<p>在幕后,python正在转换浮点(r)**p以返回“复杂”类型</p>
<p>numpy幂函数用于处理类似numpy array_的结构,其中所有项大小相同,存储在连续的内存块中,其返回类型由其参数推断</p>
<p>如果需要复数,最好的方法是使用complex64或complex128类型。这些需要更多的内存,因为每个复杂类型都由实部和虚部组成。所以complex64将由两个float32数字组成,complex128将由两个float64数字组成</p>
<pre><code>>>> import numpy as np
>>> r = np.complex128(-12025.433836763057)
>>> p = 0.74
>>> np.power(r, p)
(-715.6124638577835+762.0498735968736j)
</code></pre>
<p>您也可以在幂函数中直接强制转换:</p>
<pre><code>>>> import numpy as np
>>> r = np.float64(-12025.433836763057)
>>> p = 0.74
>>> np.power(r.astype(np.complex128), p)
(-715.6124638577835+762.0498735968736j)
</code></pre>
<p>但最简单的方法可能只是改变幂函数的返回类型,以期望得到一个复数:</p>
<pre><code>>>> import numpy as np
>>> r = np.float64(-12025.433836763057)
>>> p = 0.74
>>> np.power(r, p, dtype=np.complex128)
(-715.6124638577835+762.0498735968736j)
</code></pre>
<hr/>
<p>有趣的是,numpy通常允许从float64到复杂的类型转换,只要它们保持相同的精度水平。但是,即使casting='same_kind'kwarg被重写,它似乎也不允许隐式强制转换任何ufunc函数返回类型</p>
<pre><code>>>> np.can_cast(np.float64, complex)
True
>>> np.can_cast(np.float64, np.complex64)
False
>>> np.can_cast(np.float64, np.complex128)
True
</code></pre>
<p>根据文档,如果将标量参数传递给ufunc(与数组相反),它将使用np.result_类型和np.promote_类型中的逻辑来确定ufunc的返回类型</p>
<p><a href="https://docs.scipy.org/doc/numpy/reference/ufuncs.html" rel="nofollow noreferrer">https://docs.scipy.org/doc/numpy/reference/ufuncs.html</a></p>
<p><a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.result_type.html#numpy.result_type" rel="nofollow noreferrer">https://docs.scipy.org/doc/numpy/reference/generated/numpy.result_type.html#numpy.result_type</a></p>
<pre><code>>>> np.result_type(r, p)
dtype('float64')
</code></pre>