NumPy reshape(): как изменить массивы NumPy в Python
Опубликовано: 2022-04-20В этом руководстве вы узнаете, как использовать NumPy reshape() для изменения формы массивов NumPy без изменения исходных данных.
При работе с массивами Numpy вам часто может понадобиться преобразовать существующий массив в массив разных размеров. Это может быть особенно полезно, когда вы преобразовываете данные в несколько шагов.
А NumPy reshape()
поможет вам сделать это легко. В течение следующих нескольких минут вы изучите синтаксис для использования reshape()
, а также для преобразования массивов в другие размеры.
Что такое изменение формы в массивах NumPy?
При работе с массивами NumPy вы можете сначала создать одномерный массив чисел. А затем преобразовать его в массив с желаемой размерностью.
Это особенно полезно, когда размеры нового массива изначально неизвестны или выводятся во время выполнения. Или также может быть возможно, что определенный шаг обработки данных требует ввода определенной формы.
Вот где изменение формы пригодится.
Например, рассмотрим следующую иллюстрацию. У нас есть вектор — одномерный массив из 6 элементов. И мы можем преобразовать его в массивы форм 2×3, 3×2, 6×1 и так далее.

️ Чтобы следовать примерам из этого руководства, у вас должны быть установлены Python и NumPy. Если у вас еще нет NumPy, ознакомьтесь с нашим руководством по установке NumPy.
Теперь вы можете импортировать NumPy под псевдонимом np
, выполнив: import numpy as np
.
Давайте приступим к изучению синтаксиса в следующем разделе.
Синтаксис изменения формы NumPy()
Вот синтаксис для использования NumPy reshape():
np.reshape(arr, newshape, order = 'C'|'F'|'A')
- arr — любой допустимый объект массива NumPy. Здесь массив должен быть изменен.
- newshape — форма нового массива. Это может быть либо целое число, либо кортеж.
- Когда newshape является целым числом, возвращаемый массив является одномерным.
- порядок относится к порядку, в котором вы хотели бы прочитать элементы массива, которые должны быть изменены.
- Значение по умолчанию — «C», что означает, что элементы исходного массива будут считываться в порядке индексации, подобном C (начиная с 0).
- «F» означает индексацию, подобную Fortran (начиная с 1). И 'A' считывает элементы либо в C-подобном, либо в Fortran-подобном порядке, в зависимости от расположения памяти массива arr .
Так что же
np.reshape()
?Он возвращает измененный вид исходного массива, если это возможно. В противном случае он возвращает копию массива.
В приведенной выше строке мы упомянули, что NumPy reshape()
будет пытаться вернуть представление , когда это возможно. В противном случае он возвращает копию . Перейдем к обсуждению различий между представлением и копией.
Просмотр против копирования массивов NumPy
Как следует из названия, копия — это копия исходного массива. И любые изменения, внесенные в копию, не повлияют на исходный массив.
С другой стороны, представление просто относится к измененному виду исходного массива. Это означает, что любое изменение, внесенное в представление, также повлияет на исходный массив и наоборот.
Используйте NumPy reshape() для преобразования 1D-массива в 2D-массив
№1. Начнем с создания массива образцов с помощью np.arange().
Нам нужен массив из 12 чисел от 1 до 12, который называется arr1. Поскольку функция NumPy arange() по умолчанию исключает конечную точку, установите значение остановки на 13.
Теперь давайте воспользуемся приведенным выше синтаксисом и arr1
с 12 элементами в двумерный массив формы (4,3). Давайте назовем это arr2
с 4 строками и 3 столбцами.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2 = np.reshape(arr1,(4,3)) print("\nReshaped array:") print(arr2)
Давайте взглянем на исходный и измененный массивы.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]
Вместо передачи массива в качестве аргумента
np.reshape()
вы также можете вызвать метод.reshape()
для исходного массива.
Вы можете запустить dir(arr1)
, и он перечислит все возможные методы и атрибуты, которые вы можете использовать для объекта массива arr1
.
dir(arr1) # Output [ ... ... 'reshape' ... .. ]
В приведенной выше ячейке кода вы можете видеть, что .reshape()
является допустимым методом для использования в существующем массиве NumPy arr1
.
️ Итак, вы также можете использовать следующий упрощенный синтаксис для изменения формы массивов NumPy.
arr.reshape(d0,d1,...,dn) # where: # d0, d1,..,dn are the dimensions of the reshaped array # d0 * d1 * ...* dn = N, the number of elements in arr
В оставшейся части этого руководства давайте будем использовать этот синтаксис в наших примерах.
№ 2. Давайте попробуем преобразовать наш 12-элементный вектор в массив 12 x 1.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3 = arr1.reshape(12,1) print("\nReshaped array:") print(arr3)
В приведенном ниже выводе вы можете видеть, что массив был изменен по мере необходимости.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12]]
Итак, как нам проверить, получили ли мы копию или представление?
Чтобы проверить это, вы можете вызвать base
атрибут возвращаемого массива.
- Если массив является копией,
base
атрибутом будетNone
. - Если массив является представлением,
base
атрибутом будет исходный массив.
Давайте быстро проверим это.

arr3.base # Output array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
Как видите, base
атрибут arr3
возвращает исходный массив. Это означает, что мы получили представление исходного массива.
№3. Теперь давайте попробуем преобразовать вектор в другой допустимый массив 2 x 6.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr4 = arr1.reshape(2,6) print("\nReshaped array:") print(arr4)
И вот результат:
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]]
В следующем разделе давайте arr1
в трехмерный массив.
Используйте NumPy reshape() для преобразования одномерного массива в трехмерный массив
Чтобы преобразовать arr1
в трехмерный массив, давайте установим желаемые размеры (1, 4, 3).
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3D = arr1.reshape(1,4,3) print("\nReshaped array:") print(arr3D)
Теперь мы создали трехмерный массив с теми же 12 элементами, что и исходный массив arr1
.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]]
Как отлаживать ошибки значений во время изменения формы
Если вы помните синтаксис, изменение формы допустимо только тогда, когда произведение измерений равно количеству элементов в массиве.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2D = arr1.reshape(4,4) print("\nReshaped array:") print(arr2D)
Здесь вы пытаетесь преобразовать массив из 12 элементов в массив 4 × 4 с 16 элементами. Интерпретатор выдает ошибку значения, как показано ниже.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] ----------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-63552bcc8c37> in <module>() 6 7 # Reshape array ----> 8 arr2 = arr1.reshape(4,4) 9 print("\nReshaped array:") 10 print(arr2) ValueError: cannot reshape array of size 12 into shape (4,4)
Чтобы избежать таких ошибок, вы можете использовать -1 для автоматического определения формы одного из измерений на основе общего количества элементов.
Например, если вы заранее знаете n – 1 измерение, вы можете использовать -1 для вывода n-го измерения в измененном массиве.
Если у вас есть массив из 24 элементов, и вы хотите преобразовать его в трехмерный массив. Предположим, вам нужно 3 строки и 4 столбца. Вы можете передать значение -1 по третьему измерению.
import numpy as np arr1 = np.arange(1,25) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr_res = arr1.reshape(4,3,-1) print("\nReshaped array:") print(arr_res) print(f"Shape of arr_res:{arr_res.shape}")
Когда вы исследуете форму массива форм, вы можете видеть, что измененный массив имеет форму 2 по третьему измерению.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] Reshaped array: [[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]] [[13 14] [15 16] [17 18]] [[19 20] [21 22] [23 24]]] Shape of arr_res:(4, 3, 2)
Это особенно полезно при выравнивании массива. И вы узнаете об этом в следующем разделе.
Используйте NumPy reshape() для выравнивания массива
Бывают случаи, когда вам нужно вернуться от N-мерных массивов к плоскому массиву. Предположим, вы хотите свести изображение к длинному вектору пикселей.
Давайте напишем простой пример, используя следующие шаги:
- Создайте массив изображений в градациях серого 3 x 3,
img_arr
— с пикселями в диапазоне от 0 до 255. - Затем сгладьте этот
img_arr
и распечатайте сглаженный массивflat_arr
. - Кроме того, распечатайте формы
img_arr
иflat_arr
для проверки.
img_arr = np.random.randint(0, 255, (3,3)) print(img_arr) print(f"Shape of img_arr: {img_arr.shape}") flat_arr = img_arr.reshape(-1) print(flat_arr) print(f"Shape of flat_arr: {flat_arr.shape}")
Вот результат.
[[195 145 77] [ 63 193 223] [215 43 36]] Shape of img_arr: (3, 3) [195 145 77 63 193 223 215 43 36] Shape of flat_arr: (9,)
В приведенной выше ячейке кода вы можете видеть, что flat_arr
— это одномерный вектор значений пикселей с 9 элементами.
Подводя итоги
Пришло время быстро повторить то, что мы узнали.
- Используйте np.reshape(arr, newshape) для преобразования arr в форму, указанную в newshape . newshape — это кортеж, указывающий размеры измененного массива.
- В качестве альтернативы используйте arr.reshape(d0, d1, …, dn), чтобы изменить форму arr , чтобы она имела форму d0 x d1 x … x dn .
- Проверьте, является ли d0 * d1 * …* dn = N количеством элементов в исходном массиве, чтобы избежать ошибок значений во время изменения формы.
- Используйте -1 не более чем для одного измерения в новой форме, если вы хотите, чтобы размер определялся автоматически.
- Наконец, вы можете использовать arr.reshape(-1) для выравнивания массива.
Теперь, когда вы знаете, как использовать NumPy reshape(), узнайте, как работает функция NumPy linspace().
Вы можете попробовать примеры кода в блокноте Jupyter, если хотите. Если вы ищете другие среды разработки, ознакомьтесь с нашим руководством по альтернативам Jupyter.