[英]Why do I have to “from module import” with the email module in python?
[英]Why do I have to import this from numpy if I am just referencing it from the numpy module
阿羅哈!
我有兩個代碼塊,一個可以工作,另一個不會。 唯一的區別是我不使用的numpy模塊的注釋代碼行。 當我從不引用“npm”時,為什么我需要導入該模型?
此命令有效:
import numpy as np
import numpy.matlib as npm
V = np.array([[1,2,3],[4,5,6],[7,8,9]])
P1 = np.matlib.identity(V.shape[1], dtype=int)
P1
此命令不起作用:
import numpy as np
#import numpy.matlib as npm
V = np.array([[1,2,3],[4,5,6],[7,8,9]])
P1 = np.matlib.identity(V.shape[1], dtype=int)
P1
上面得到了這個錯誤:
AttributeError: 'module' object has no attribute 'matlib'
提前致謝!
這是因為numpy.matlib
是numpy
的可選子包,必須單獨導入。
此功能的原因可能是:
numpy
, numpy.matlib
子模塊重新定義numpy
的函數來返回矩陣而不是ndarrays,這是一個許多人可能不想要的可選功能 當你導入numpy
而沒有子包matlib
,Python會尋找.matlib
作為numpy
包的一個屬性。 如果沒有導入numpy.matlib
該屬性尚未分配給numpy
(請參閱下面的討論)
如果你想知道為什么np.matlib.identity
工作而不必使用關鍵字npm
,那是因為當你導入子模塊matlib
,父模塊numpy
(在你的情況下命名為np
)將被賦予一個屬性matlib
,這是綁定到子模塊。 這只適用於您首先定義numpy
。
來自參考 :
當使用任何機制(例如,importlib API,import或import-from語句或內置import ())加載子模塊時,綁定將放置在父模塊的命名空間中,並附加到子模塊對象。
要導入的內容的選擇取決於模塊目錄中模塊各自的__init__.py
文件。 您可以使用dir()
函數查看相應模塊定義的名稱。
>> import numpy
>> 'matlib' in dir(numpy)
# False
>> import numpy.matlib
>> 'matlib' in dir(numpy)
# True
或者,如果您直接查看__init__.py
文件以獲取numpy
您將看到matlib
沒有導入。
如果你想知道命名空間是如何順利復制的;
matlib
源代碼運行此命令以復制numpy
命名空間:
import numpy as np # (1)
...
# need * as we're copying the numpy namespace
from numpy import * # (2)
...
__all__ = np.__all__[:] # copy numpy namespace # (3)
第(2)行, from numpy import *
尤為重要。 因此,您會注意到如果您只是導入numpy.matlib
您仍然可以使用所有numpy
模塊而無需導入numpy
!
如果沒有第(2)行,第(3)行中的命名空間副本只會附加到子模塊。 有趣的是,由於第(3)行,你仍然可以做這樣一個有趣的命令。
import numpy.matlib
numpy.matlib.np.matlib.np.array([1,1])
這是因為np.__all__
附着到np
的numpy.matlib
(其經管線(1)導入)。
你從不使用npm
但你確實使用了np.matlib
,所以你可以將你的第二個導入行改為:
import numpy.matlib
或者您可以按原樣保留第二個導入行,而是使用:
P1 = npm.identity(V.shape[1], dtype=int)
你有沒有理由不使用np.identity
?
P1 = np.identity(V.shape[1], dtype=int)
該模塊包含numpy命名空間中的所有函數,具有以下替換函數,這些函數返回矩陣而不是ndarrays。
除非你堅持使用2d np.matrix
子類,否則你最好堅持使用常規的ndarray
版本。
(其他人已經指出,導入為什么是基於numpy
的__init__
規范numpy
導入大部分,但不是所有子模塊。它不自動導入的子模塊使用次數較少。這是一種禮貌的說法, You don't really need this module
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.