[英]Why is numpy.dtype('float64') special?
有人可以解釋下面腳本輸出背后的邏輯嗎?
import numpy
if(numpy.dtype(numpy.float64) == None):
print "Surprise!!!!"
謝謝 :)
看起來像一個不幸的事故:有人認為dtype(None)
會“默認”浮動(盡管dtype()
是一個錯誤)。 然后其他人寫了dtype.__eq__
這樣它在比較之前將它的第二個參數轉換為dtype.__eq__
。 所以dtype(float) == None
是dtype(float) == dtype(None)
,這是真的。
你可以在這里看到源代碼中的注釋: descriptor.c#L1217
- 從對象獲取typenum - 無進入NPY_DEFAULT_TYPE
當然NPY_DEFAULT_TYPE是浮點數(至少通常是)。
至於__eq__
運算符,它位於 : descriptor.c#L3317 。 它完成我概述的內容:
if (!PyArray_DescrCheck(other)) {
if (PyArray_DescrConverter(other, &new) == NPY_FAIL) {
return NULL;
}
}
所以這是從==
右邊的任何東西到dtype對象的轉換,通過之前提到的轉換器函數,將None
轉換為dtype(float)
。
編輯:我發現這非常有趣,這似乎是一個意外,所以我創建了一個補丁並提交給維護者: https : //github.com/numpy/numpy/pull/4532 。
如果你想在python中將任意對象與完全None
,你需要使用:
object is None
就像在這種情況下一樣,任何對象都可以覆蓋其比較運算符,而不是按照您的期望來執行。
至於為什么,dtype('float64')在dtypes的上下文中等同於None,dtypes相當於類型字符串
np.dtype('i4') == 'i4'
True
平等不是身份。
至於為什么dtype(None) == dtype('float64')
,numpy中的許多函數都有dtype=None
關鍵字參數。 在大多數情況下,這意味着默認dtype為dtype(None)
。 一個例子是np.zeros
。 但也有例外,例如,當dtype可以從參數中推斷出來時,就像在np.arange(10)
中的情況一樣,默認dtype將是整數類型(我認為是np.intp
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.