簡體   English   中英

為什么numpy.dtype('float64')特別?

[英]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) == Nonedtype(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.

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