簡體   English   中英

如果我只是從numpy模塊引用它,為什么我必須從numpy導入它

[英]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.matlibnumpy的可選子包,必須單獨導入。

此功能的原因可能是:

  • 特別是對於numpynumpy.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

要導入的內容的選擇取決於模塊目錄中模塊各自的__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__附着到npnumpy.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.

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