Разница между импортной numpy и import numpy как np
Я понимаю, что, когда это возможно, следует использовать
import numpy as np
Это помогает избежать конфликта из-за пространств имен. Но я заметил, что, хотя команда ниже работает
import numpy.f2py as myf2py
не выполняется
import numpy as np
np.f2py #throws no module named f2py
Может кто-нибудь объяснить это?
Ответы
Ответ 1
numpy - это имя верхнего пакета, а выполнение import numpy
не импортирует подмодуль numpy.f2py
.
Когда вы выполняете import numpy
, он создает ссылку, которая указывает на numpy
, но numpy
не привязана к f2py
. Ссылка устанавливается, когда вы делаете import numpy.f2py
В приведенном выше коде:
import numpy as np # np is an alias pointing to numpy, but at this point numpy is not linked to numpy.f2py
import numpy.f2py as myf2py # this command makes numpy link to numpy.f2py. myf2py is another alias pointing to numpy.f2py as well
Вот разница между import numpy.f2py
и import numpy.f2py as myf2py
:
-
import numpy.f2py
- поместите numpy в таблицу локальных символов (указывая на numpy), а numpy связан с numpy.f2py
- доступны numpy и numpy.f2py
-
import numpy.f2py as myf2py
- поместите my2py в таблицу локальных символов (указывая на numpy.f2py)
- Его родительский numpy не добавляется в локальную таблицу символов. Поэтому вы не можете напрямую обращаться к numpy.
Ответ 2
Синтаксис import as
был введен в PEP 221 и хорошо документирован там.
При импорте модуля через
import numpy
пакет numpy привязан к локальной переменной numpy
. Синтаксис import as
просто позволяет вам привязать импорт к локальному имени переменной по вашему выбору (обычно, чтобы избежать коллизий имен, сокращать имена вербальных модулей или стандартизировать доступ к модулям с совместимыми API-интерфейсами).
Таким образом,
import numpy as np
эквивалентно,
import numpy
np = numpy
del numpy
При попытке понять этот механизм стоит вспомнить, что import numpy
на самом деле означает import numpy as numpy
.
При импорте подмодуля вы должны обратиться к имени полного родительского модуля, поскольку механики импорта происходят на более высоком уровне, чем область локальной переменной. то есть.
import numpy as np
import numpy.f2py # OK
import np.f2py # ImportError
Я также не согласен с вашим утверждением, что "где возможно, следует [import numpy as np]". Это делается по историческим причинам, главным образом потому, что люди очень быстро устают от префикса каждой операции с помощью numpy
. Это никогда не помешало мне столкнуться с именем (ленивость программистов на самом деле предполагает более высокую вероятность столкновения с np
)
Наконец, чтобы закончить мой exposé, вот 2 интересных использования механизма import as
, о котором вы должны знать:
1. длинные субобъекты
import scipy.ndimage.interpolation as warp
warp.affine_transform(I, ...)
2. совместимые API
try:
import pyfftw.interfaces.numpy_fft as fft
except:
import numpy.fft as fft
# call fft.ifft(If) with fftw or the numpy fallback under a common name
Ответ 3
Это языковая функция. f2py
представляет собой подпакет модуля numpy
и должен быть загружен отдельно.
Эта функция позволяет:
- вы загружаете из
numpy
только нужные вам пакеты, ускоряя выполнение.
- разработчики
f2py
имеют разделение пространства имен от разработчиков другого подпакета.
Обратите внимание, что import numpy.f2py
или его вариант import numpy.f2py as myf2py
по-прежнему загружают родительский модуль numpy
.
Сказал, что при запуске
import numpy as np
np.f2py
Вы получаете AttributeError
, потому что f2py
не является атрибутом numpy
, потому что __init__()
пакета numpy
не объявлял в своей области ничего о субпакете f2py
.
Ответ 4
numpy.f2py
на самом деле является подмодулем numpy
и поэтому должен быть импортирован отдельно от numpy. Как сказал aha:
Когда вы импортируете numpy, он создает ссылку, указывающую на numpy, но numpy не связано с f2py. Ссылка устанавливается, когда вы do import numpy.f2py
когда вы вызываете оператор import numpy as np
, вы сокращаете фразу "numpy" на "np", чтобы сделать код более удобным для чтения. Это также помогает избежать проблем с пространством имен. (tkinter и ttk - хороший пример того, что может произойти, когда у вас есть эта проблема. Пользовательский интерфейс выглядит совсем по-другому.)
Ответ 5
Ну, довольно старый пост, но вот мои 2 цента за объяснение, предоставленное другими.
numpy (см. репозиторий git) имеют различные подпакеты, f2py - один из них, другие - как ядро, ma и т.д.
Если вы ссылаетесь на init.py в пакете numpy, он имеет импорт, например -
from . import core etc
но он не имеет импорта для подпакета f2py.
Это причина, по которой утверждение вроде
import numpy as np
np.f2py
не будет работать, но
import numpy as np
np.core
будет работать.