English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Изменение формы массивов NumPy

Форма массива - это количество элементов в каждом измерении.

Получение формы массива

Печать формы 2-D массива:

import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)

Результат выполнения

(2, 4)

Пример上面的 возвращает (2, 4), что означает, что массив имеет 2 измерения, каждый из которых содержит 4 элемента.

Используя ndmin с значением 1,2,3,4 вектор, создать массив с 5 размерами и проверить значение последнего размера 4:

import numpy as np
arr = np.array([1, 2, 3, 4], ndmin=5)
print(arr)
print('форма массива:', arr.shape)

Результат выполнения

[[[[[1 2 3 4]]]]]
форма массива: (1, 1, 1, 1, 4)
Что означает форма кортежа?

Целое число на каждом индексе указывает на количество элементов в соответствующей оси.
В примере индекс 4, наше значение 4, поэтому можно сказать, что 5-й (4 + 1) размер имеет 4 элемента.

Изменение формы массива

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

Преобразование из 1-D в 2-D

Преобразовать следующий одномерный массив из 12 элементов в двумерный массив.
Внешний размер будет иметь 4 массива, каждый из которых содержит 3 элемента:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
print(newarr)

Результат выполнения

[[ 1 2 3]
 [ 4 5 6]
 [ 7 8 9]
 [10 11 12]]

Преобразование из 1-D в 3-D

Преобразовать следующий одномерный массив из 12 элементов в трехмерный массив.
Внешний размер будет иметь 2 массива, содержащие 3 массива, каждый из которых содержит 2 элемента:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(2, 3, 2)
print(newarr)

Результат выполнения

[[[[ 1 2]
  [ 3 4]
  [ 5 6]]
 [[ 7 8]
  [ 9 10]
  [11 12]]]
Может ли массив быть изменен в любую форму?

Да, если количество элементов, необходимых для трансформации, одинаково в обеих формах.
Мы можем преобразовать одномерный массив из 8 элементов в 2 строки 2D массива с 4 элементами, но мы не можем преобразовать его в 3 элемента 3 строки 2D массива, так как это потребует 3x3 = 9 элементов.

Попытка преобразовать одномерный массив с 8 элементами в двумерный массив с 3 элементами в каждой из осей (это вызовет ошибку):

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
newarr = arr.reshape(3, 3)
print(newarr)

Результат выполнения

Traceback (последний вызов в начале):
  Файл "test.py", строка 5, в

Неизвестный размер

Вы можете использовать «неизвестное» измерение.
Это означает, что вам не нужно указывать точное число для одного из измерений в методе reshape.
Передача -1 в качестве значения, NumPy автоматически вычислит это число.

Преобразование 1D массива из 8 элементов в 3D массив с 2x2 элементами:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
newarr = arr.reshape(2, 2, -1)
print(newarr)

Результат выполнения

[[[1 2]
  [3 4]]
 [[5 6]
  [7 8]]]
Внимание:Мы не можем передавать -1 более чем одному измерению.

Флаттеринг массивов

Флаттеринг массивов (Flattening the arrays) означает преобразование много мерного массива в 1D массив.
Для этого можно использовать reshape(-1).
Преобразование массива в 1D массив:

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)

Результат выполнения

[1 2 3 4 5 6]

Есть много функций, которые можно изменить для изменения формы массивов flatten, ravel, а также для перестановки элементов rot90, flip, fliplr, flipud и т.д. Эти функции относятся к среднему и высокому уровню NumPy.