Как numpy.ndarray.transpose () переставляет ось массива nd?

In [28]: arr = np.arange(16).reshape((2, 2, 4)) In [29]: arr Out[29]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) In [32]: arr.transpose((1, 0, 2)) Out[32]: array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]]) 

Когда мы передаем кортеж целых чисел функции transpose() , что происходит?

Чтобы быть конкретным, это трехмерный массив: как NumPy преобразует массив при передаче кортежа осей (1, 0 ,2) ? Можете ли вы объяснить, к какой строке или столбцу относятся эти целые числа? А что такое номера осей в контексте NumPy?

2 Solutions collect form web for “Как numpy.ndarray.transpose () переставляет ось массива nd?”

Короче: перенос массива означает, что NumPy просто нужно переставить информацию о шаге и форме для каждой оси:

 >>> arr.strides (64, 32, 8) >>> arr.transpose(1, 0, 2).strides (32, 64, 8) 

Обратите внимание, что шаги для первой и второй осей были заменены здесь. Это означает, что данные не должны копироваться; NumPy может просто изменить, как он смотрит на память, чтобы построить массив.


Какие успехи?

Значения в трехмерном массиве arr хранятся в непрерывном блоке памяти следующим образом:

 [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

В случае arr каждое целое число занимает 8 байт памяти (т.е. мы используем тип int64).

Шаг указывает NumPy, сколько байтов пропустить, чтобы перейти к следующему значению вдоль оси. Например, чтобы получить следующее значение в строке в arr (ось 2), нам просто нужно переместить 8 байтов (1 номер).

arr.transpose(1, 0, 2) для arr.transpose(1, 0, 2) являются (32, 64, 8). Для перемещения по первой оси вместо 64 байтов (8 чисел) NumPy теперь будет пропускать только 32 байта (4 числа) каждый раз:

 [[[0 ...] [... ...]] [[4 ...] [... ...]]] 

Аналогично, NumPy теперь пропускает 64 байта (8 чисел) для перемещения по оси 1:

 [[[0 ...] [8 ...]] [[4 ...] [12 ...]]] 

Фактический код, который выполняет транспонирование, написан на C и может быть найден здесь .

Как поясняется в документации :

По умолчанию измените размеры, иначе переместите оси в соответствии с указанными значениями.

Таким образом, вы можете передать необязательные axes параметров, определяющие новый порядок измерений.

Например, перенос первых двух измерений матрицы пикселов VGA VGA:

  >>> x = np.ones((480, 640, 3)) >>> np.transpose(x, (1, 0, 2)).shape (640, 480, 3) 
  • Эффективный продукт 1D массива и трехмерного массива по одному измерению - NumPy
  • Запись в составный набор данных с переменной длиной строки через h5py (HDF5)
  • Как я могу использовать numpy без его установки?
  • Почему python поднимает ошибку во время выполнения, а я запускаю numpy.percentile для выравнивания с помощью scikit-image?
  • Сумма вдоль оси в массиве numpy
  • многоуровневый массив объектов
  • График таймплоттинга Matplotlib из матрицы numpy
  • Как превратить логический массив в индексный массив в numpy
  •  
    Interesting Posts for Van-Lav

    PyQT откроет веб-страницу с всплывающим предупреждением JS, появится SegFault. Как это исправить?

    Sikuli UnsatisfiedLinkError при использовании sikuli-script.jar

    Установка прямой линии на кривую log-log в matplotlib

    Использование модуля ImageDraw PIL

    Pip не устанавливает последнюю доступную версию из pypi (argparse в этом случае)

    Легенда Matplotlib, добавлять элементы по столбцам, а не вниз

    Как я могу сбросить строку в Python 2?

    Интерполирование рассеянных данных из тома с пустым пространством

    Интерфейсные модули тестирования в Python

    Использование парных сертификатов с urllib2

    Как принять keypress в командной строке python?

    Как вы можете установить атрибуты класса из переменных аргументов (kwargs) в python

    Boost :: Python – возможно автоматическое преобразование из dict -> std :: map?

    Как инициализировать массив NumPy с различным значением по умолчанию для каждого столбца?

    Ошибка pip / easy_install: не удалось создать процесс

    Python - лучший язык программирования в мире.