簡體   English   中英

在Python 3.6中,為什么在一個numpy數組中,一個分數的冪的負數會返回nan?

[英]In Python 3.6, why does a negative number to the power of a fraction return nan when in a numpy array?

我最近開始學習Python,並且我一直在閱讀NumPy官方快速入門指南 ,其中包含用於迭代的這個示例。

>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   
729])
>>> for i in a:
...     print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

但是,如果我只是嘗試將-1000提高到循環外的(1/3。)的冪,則返回一個值。

>>> -1000**(1/3.)
-9.999999999999998

括號大約-1000,它也返回一個值。

>>> (-1000)**(1/3.)
(5+8.660254037844384j)

為什么同一個動作在for循環中返回nan 我正在使用Python 3.6.3 :: Anaconda自定義(64位)。 我也嘗試了不會向上舍入的不同分數,它也是一樣的。 使用一個向上舍入到.0的分數它可以工作。

我找不到類似的問題。 如果我錯過了一些非常明顯的東西,請原諒。

編輯:一些評論提到問題重復NumPy,RuntimeWarning:在電源中遇到無效值 ,這是真的,問題是我沒有看到這樣的錯誤。 然而,那里的討論似乎包括一些可能的解決方法。

python中的指數優先於負數運算符。 因此-1000**(1/3)相當於-(1000**(1/3))

當你在做環路此操作你(-1000)**(1/3) 這等於復數的 10 * (-1**(1/3)) 現在,您擁有的數組使用默認數據類型,因為您沒有定義根據文檔確定的任何數據,如下所示:

dtype: 數據類型,可選

數組所需的數據類型。 如果沒有給出,那么類型將被確定為保持序列中的對象所需的最小類型。 此參數只能用於“upcast”數組。 對於向下轉換,請使用.astype(t)方法。

所以它可能是np.int16

將所有信息放在一起,我們可以得出結論,即使結果存在 ,您的數組也沒有配備適當的dtype屬性,以便能夠保存 (-1000)**(1/3)的結果。

這不會發生數組之外,因為沒有dtype


修復\\解決方法:

>>> a = np.array([-1000, 1], dtype=np.complex)
>>> for i in a:
...     print(i**(1/3.))
...
(5+8.66025403784j)
(1+0j)

這只是為您的問題修復它的捷徑。

 def ownpow(a, b):
        if a > 0:
            return a**b
        if a < 0:
            temp = abs(a)**b
            return -1*temp

    a= np.array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,  729]) 

    for i in a:
        print(ownpow(i,(1/3.)))

明顯的numpy數組值不能提升為負數,因為這可能會導致復數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM