Временная сложность numpy.transpose - PullRequest
4 голосов
/ 08 октября 2019

Какова временная сложность np.transpose?

По моему мнению, он зацикливается на два цикла внутри, так что это означает, что он должен иметь сложность O (n2), но кто-то может подтвердить это? Кроме того, есть ли способ, чтобы я мог уменьшить сложность времени транспонирования матрицы

Ответы [ 3 ]

5 голосов
/ 08 октября 2019

Это O (1), потому что он вообще не копирует данные. Просто изменяет форму и шагает.

>>> A = np.random.rand(3,4)
>>> A.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>>> np.transpose(A).flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

Обратите внимание, что C_CONTIGUOUS, F_CONTIGUOUS были поменяны местами (т. Е. Основные изменения порядка итераций), а транспонированный массив имеет OWNDATA false (т. Е. Это просто просмотр данных исходного массива).

Подсказка: если у вас есть такое представление, чтобы найти массив с данными, вы можете проверить base атрибут

>>> np.transpose(A).base is A
True
3 голосов
/ 08 октября 2019

В памяти матрицы представляются в виде блоков непрерывной памяти, то есть, как если бы это был одномерный массив. N-измерения - это абстракция, которую мы, люди, используем, чтобы сделать проблему более понятной. Для numpy транспонирование матрицы - это просто изменение оси, но память не изменяется.

Таким образом, временная сложность равна O (1) , потому что для транспонирования массива просто numpyменяет информацию о форме и шаге для каждой оси.

Для этого не требуется копировать данные. Numpy может просто изменить свой внешний вид памяти для создания нового массива.

Если вы хотите углубить тему, вы можете увидеть этот красивый ответ с иллюстрациями

0 голосов
/ 08 октября 2019

Да, к тому же мы можем транспонировать матрицу, используя zip

list(zip(*matrix))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...