[英]Python Numpy: how to get the fraction of the frequency of a specific number in an array
[英]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.