python ravel vs. transpose при использовании в reshape

У меня есть 2D-массив v , v.shape=(M_1,M_2) , который я хочу переделать в трехмерный массив с v.shape=(M_2,N_1,N_2) и M_1=N_1*N_2 .

Я придумал следующие строки, которые дают тот же результат:

 np.reshape(vT, reshape_tuple) 

а также

 np.reshape(v.ravel(order='F'), reshape_tuple) 

для reshape_tuple=(M_2,N_1,N_2) .

Какой из них лучше вычислить и в каком смысле (время компиляции, память и т. Д.), Если исходный v является огромной (возможно, комплекснозначной) матрицей?

Мое предположение было бы в том, что использование транспонирования лучше, но если reshape делает автоматическое ravel возможно, опция ravel быстрее (хотя reshape может сделать ravel на C или Fortran, а затем это не ясно)?

  • Это лучший способ добавить дополнительное измерение в массив numpy в одной строке кода?
  • Numpy - нарезание 2d строк или столбцов из массива
  • переформатировать массив изображений
  • Изменение размера изображения на экране
  • Редактировать многоформатные форматы длинного формата с помощью Pandas
  • разделил серию Pandas без мультииндекса
  • загрузить csv в 2D-матрицу с numpy для построения графика
  • Измените массив в NumPy
  • One Solution collect form web for “python ravel vs. transpose при использовании в reshape”

    Порядок, в котором они делают что-то – изменить, изменить шаги и сделать копию – отличается, но они в конечном итоге делают то же самое.

    Мне нравится использовать __array_interface__ чтобы увидеть, где находится буфер данных, и другие изменения. Полагаю, я должен добавить flags чтобы увидеть order . Но мы / вы знаете, что transpose меняет порядок на F уже, верно?

     In [549]: x=np.arange(6).reshape(2,3) In [550]: x.__array_interface__ Out[550]: {'data': (187732024, False), 'descr': [('', '<i4')], 'shape': (2, 3), 'strides': None, 'typestr': '<i4', 'version': 3} 

    transpose – это вид, с другой формой, шагами и порядком:

     In [551]: xT__array_interface__ Out[551]: {'data': (187732024, False), 'descr': [('', '<i4')], 'shape': (3, 2), 'strides': (4, 12), 'typestr': '<i4', 'version': 3} 

    ravel с другим порядком – это копия (другой указатель буфера данных)

     In [552]: x.ravel(order='F').__array_interface__ Out[552]: {'data': (182286992, False), 'descr': [('', '<i4')], 'shape': (6,), 'strides': None, 'typestr': '<i4', 'version': 3} 

    transpose ravel также является копией. Я думаю, что один и тот же указатель данных – это всего лишь случай повторного использования памяти (поскольку я не назначаю переменную), но это можно проверить.

     In [553]: xTravel().__array_interface__ Out[553]: {'data': (182286992, False), 'descr': [('', '<i4')], 'shape': (6,), 'strides': None, 'typestr': '<i4', 'version': 3} 

    добавьте изменение:

     In [554]: xTravel().reshape(2,3).__array_interface__ Out[554]: {'data': (182286992, False), 'descr': [('', '<i4')], 'shape': (2, 3), 'strides': None, 'typestr': '<i4', 'version': 3} In [555]: x.ravel(order='F').reshape(2,3).__array_interface__ Out[555]: {'data': (182286992, False), 'descr': [('', '<i4')], 'shape': (2, 3), 'strides': None, 'typestr': '<i4', 'version': 3} 

    Я думаю, что существует неявное «ravel» в изменении:

     In [558]: xTreshape(2,3).__array_interface__ Out[558]: {'data': (182286992, False), 'descr': [('', '<i4')], 'shape': (2, 3), 'strides': None, 'typestr': '<i4', 'version': 3} 

    (Я должен переделать эти примеры, чтобы избавиться от неоднозначности повторного использования памяти.) Во всяком случае, для изменения после транспонирования требуется такая же копия памяти, что и ravel с изменением заказа. И насколько я могу судить, для одного из них требуется только одна копия. Другие операции включают изменения атрибутов, таких как форма.

    Может быть, яснее, если мы просто посмотрим на массивы

     In [565]: xT Out[565]: array([[0, 3], [1, 4], [2, 5]]) 

    В T мы все равно можем пройти через массив в числовом порядке. Но после изменения, 1 не приближается к 0 . Очевидно, что есть копия.

     In [566]: xTreshape(2,3) Out[566]: array([[0, 3, 1], [4, 2, 5]]) 

    порядок значений после того, как ravel выглядит схожим, и, более очевидно, после перестановки.

     In [567]: x.ravel(order='F') Out[567]: array([0, 3, 1, 4, 2, 5]) In [568]: x.ravel(order='F').reshape(2,3) Out[568]: array([[0, 3, 1], [4, 2, 5]]) 
    Python - лучший язык программирования в мире.