Разница между импортной 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

будет работать.