Порядок массива в `numpy.dot`
В Python числовая библиотека NumPy, как функция numpy.dot
имеет дело с массивами различного порядка памяти? numpy.dot(c-order, f-order)
против dot(f-order, c-order)
и т.д.
Причина, по которой я спрашиваю, что давно (numpy 1.0.4?), я сделал несколько тестов и заметил, что numpy.dot
выполняется хуже, чем вызов dgemm
из scipy.linalg
напрямую, с правильными флагами транспонирования, хотя оба вызывать одну и ту же библиотеку BLAS внутри. (Я подозревал, что причина заключалась в копировании входных матриц внутри numpy.dot
, что трагично, если вход большой.)
Теперь я снова попробовал, и на самом деле numpy.dot
выполняет то же самое, что и dgemm
, поэтому нет причин держать массивы в определенном порядке и устанавливать флаги транспонирования вручную. Очень чистый код.
Итак, мой вопрос: как работает недавняя работа (пусть говорят 1.6.0) numpy.dot
, гарантирует, когда все будет скопировано, а когда нет? Я беспокоюсь о 1) памяти 2) производительности здесь. Приветствия.
Ответы
Ответ 1
Возможно, что то, что вы видели, возможно, связано с ошибкой импорта точки с оптимизацией blas, которую поймают и обрабатывают без помех (этот фрагмент кода от numeric.py)
# try to import blas optimized dot if available
try:
# importing this changes the dot function for basic 4 types
# to blas-optimized versions.
from _dotblas import dot, vdot, inner, alterdot, restoredot
except ImportError:
# docstrings are in add_newdocs.py
inner = multiarray.inner
dot = multiarray.dot