Манипулирование массивами NumPy
NumPy содержит некоторые функции для обработки массивов, которые можно условно разделить на следующие категории:
- Изменение формы массива
- Переворот массива
- Изменение размерностей массива
- Объединение массивов
- Разделение массивов
- Добавление и удаление элементов массива
Изменение формы массива
| Функция | Описание |
|---|---|
reshape |
Изменение формы без изменения данных |
flat |
Итератор элементов массива |
flatten |
Вернуть копию массива. Изменения, внесённые в копию, не повлияют на исходный массив. |
ravel |
Вернуть плоский массив |
numpy.reshape
Функция numpy.reshape может изменять форму без изменения данных. Формат следующий:
numpy.reshape(arr, newshape, order='C')
arr: Массив, форму которого нужно изменитьnewshape: Целое число или массив целых чисел. Новая форма должна быть совместима с исходной формой.- order: 'C' -- по строкам, 'F' -- по столбцам, 'A' -- исходный порядок, 'k' -- порядок, в котором элементы располагаются в памяти.
Пример
Вывод следующий:
原始数组: [0 1 2 3 4 5 6 7] 修改后的数组: [[0 1] [2 3] [4 5] [6 7]]
numpy.ndarray.flat
numpy.ndarray.flat — это итератор элементов массива. Пример:
Пример
Вывод следующий:
原始数组: [0 1 2] [3 4 5] [6 7 8] 迭代后的数组: 0 1 2 3 4 5 6 7 8
numpy.ndarray.flatten
numpy.ndarray.flatten возвращает копию массива. Изменения, сделанные в копии, не повлияют на исходный массив. Формат следующий:
ndarray.flatten(order='C')
Описание параметра:
- order: 'C' -- по строкам, 'F' -- по столбцам, 'A' -- исходный порядок, 'K' -- порядок, в котором элементы располагаются в памяти.
Пример
Вывод следующий:
原数组: [[0 1 2 3] [4 5 6 7]] 展开的数组: [0 1 2 3 4 5 6 7] 以 F 风格顺序展开的数组: [0 4 1 5 2 6 3 7]
numpy.ravel
numpy.ravel() уплощает элементы массива, обычно в порядке 'C style'. Он возвращает представление массива (view, несколько похожее на ссылку в C/C++). Изменения затронут исходный массив.
Эта функция принимает два параметра:
numpy.ravel(a, order='C')
Описание параметра:
- order: 'C' -- по строкам, 'F' -- по столбцам, 'A' -- исходный порядок, 'K' -- порядок, в котором элементы располагаются в памяти.
Пример
Вывод следующий:
原数组: [[0 1 2 3] [4 5 6 7]] 调用 ravel 函数之后: [0 1 2 3 4 5 6 7] 以 F 风格顺序调用 ravel 函数之后: [0 4 1 5 2 6 3 7]
Переворот массива
| Функция | Описание |
|---|---|
transpose |
Поменять местами размерности массива |
ndarray.T |
иself.transpose()То же самое |
rollaxis |
Прокрутить указанную ось назад |
swapaxes |
Поменять местами две оси массива |
numpy.transpose
Функция numpy.transpose используется для перестановки размерностей массива. Формат следующий:
numpy.transpose(arr, axes)
Описание параметра:
arr: Массив, над которым выполняется операцияaxes: Список целых чисел, соответствующий размерностям. Обычно все размерности меняются местами.
Пример
Вывод следующий:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 对换数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
numpy.ndarray.T аналогичен numpy.transpose:
Пример
Вывод следующий:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 转置数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
numpy.rollaxis
Функция numpy.rollaxis перемещает указанную ось назад в определённую позицию. Формат следующий:
numpy.rollaxis(arr, axis, start)
Описание параметра:
arr: Массивaxis: Ось, которую нужно переместить назад. Относительные позиции остальных осей не изменятся.start: По умолчанию равно нулю, что означает полный откат. Ось будет перемещена в определённую позицию.
Пример
Вывод следующий:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 获取数组中一个值: (array([1]), array([1]), array([0])) 6 调用 rollaxis 函数: [[[0 2] [4 6]] [[1 3] [5 7]]] (array([0]), array([1]), array([1])) 调用 rollaxis 函数: [[[0 2] [1 3]] [[4 6] [5 7]]] (array([1]), array([0]), array([1]))
numpy.swapaxes
Функция numpy.swapaxes используется для перестановки двух осей массива. Формат следующий:
numpy.swapaxes(arr, axis1, axis2)
arr: Входной массивaxis1: Целое число, соответствующее первой осиaxis2: Целое число, соответствующее второй оси
Пример
Вывод следующий:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 调用 swapaxes 函数后的数组: [[[0 4] [2 6]] [[1 5] [3 7]]]
Изменение размерностей массива
| Измерение | Описание |
|---|---|
broadcast |
Создать объект, имитирующий широковещание |
broadcast_to |
Транслировать массив в новую форму |
expand_dims |
Расширить форму массива |
squeeze |
Удалить одномерные элементы из формы массива |
numpy.broadcast
numpy.broadcast — это объект, используемый для имитации broadcasting. Он возвращает объект, который инкапсулирует результат broadcasting одного массива в другой.
Эта функция использует два массива в качестве входных параметров, как в следующем примере:
Пример
Вывод:
对 y 广播 x: 1 4 1 5 广播对象的形状: (3, 3) 手动使用 broadcast 将 x 与 y 相加: (3, 3) 调用 flat 函数: [[5. 6. 7.] [6. 7. 8.] [7. 8. 9.]] x 与 y 的和: [[5 6 7] [6 7 8] [7 8 9]]
numpy.broadcast_to
Функция numpy.broadcast_to выполняет broadcast массива в новую форму. Она возвращает представление исходного массива, доступное только для чтения. Обычно оно не является непрерывным. Если новая форма не соответствует правилам broadcasting NumPy, функция может выбросить ValueError.
numpy.broadcast_to(array, shape, subok)
Пример
Вывод:
原数组: [[0 1 2 3]] 调用 broadcast_to 函数之后: [[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3]]
numpy.expand_dims
Функция numpy.expand_dims расширяет форму массива, вставляя новую ось в указанной позиции. Формат функции следующий:
numpy.expand_dims(arr, axis)
Описание параметра:
arr: Входной массивaxis: Позиция, в которую вставляется новая ось
Пример
Результат вывода:
数组 x: [[1 2] [3 4]] 数组 y: [[[1 2] [3 4]]] 数组 x 和 y 的形状: (2, 2) (1, 2, 2) 在位置 1 插入轴之后的数组 y: [[[1 2]] [[3 4]]] x.ndim 和 y.ndim: 2 3 x.shape 和 y.shape: (2, 2) (2, 1, 2)
numpy.squeeze
Функция numpy.squeeze удаляет единичные размерности из формы заданного массива. Формат функции следующий:
numpy.squeeze(arr, axis)
Описание параметра:
arr: входной массивaxis: целое число или кортеж целых чисел, используемый для выбора подмножества единичных размерностей в форме
Пример
Результат вывода:
数组 x: [[[0 1 2] [3 4 5] [6 7 8]]] 数组 y: [[0 1 2] [3 4 5] [6 7 8]] 数组 x 和 y 的形状: (1, 3, 3) (3, 3)
Объединение массивов
| Функция | Описание |
|---|---|
concatenate |
Объединяет последовательность массивов вдоль существующей оси. |
stack |
Объединяет последовательность массивов вдоль новой оси. |
hstack |
Объединяет массивы в последовательность по горизонтали (в направлении столбцов). |
vstack |
Объединяет массивы в последовательность по вертикали (в направлении строк). |
numpy.concatenate
Функция numpy.concatenate используется для объединения двух или более массивов одинаковой формы вдоль заданной оси. Формат следующий:
numpy.concatenate((a1, a2, ...), axis)
Описание параметра:
a1, a2, ...: массивы одного типаaxis: ось, вдоль которой объединяются массивы; по умолчанию — 0
Пример
Результат вывода:
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 沿轴 0 连接两个数组: [[1 2] [3 4] [5 6] [7 8]] 沿轴 1 连接两个数组: [[1 2 5 6] [3 4 7 8]]
numpy.stack
Функция numpy.stack используется для объединения последовательности массивов вдоль новой оси. Формат следующий:
numpy.stack(arrays, axis)
Описание параметра:
arraysПоследовательность массивов одинаковой формыaxis: ось в возвращаемом массиве, вдоль которой объединяются входные массивы
Пример
Результат вывода следующий:
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 沿轴 0 堆叠两个数组: [[[1 2] [3 4]] [[5 6] [7 8]]] 沿轴 1 堆叠两个数组: [[[1 2] [5 6]] [[3 4] [7 8]]]
numpy.hstack
numpy.hstack — удобная обёртка над numpy.concatenate, используемая для горизонтального объединения массивов вдоль второй оси (axis=1).
numpy.hstack рассматривает одномерные массивы как векторы-столбцы при конкатенации, что эквивалентно numpy.concatenate([numpy.atleast_1d(arr) for arr in arrays], axis=1) (когда все массивы имеют размерность ≥2, они напрямую конкатенируются вдоль axis=1).
Пример
Результат вывода следующий:
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 水平堆叠: [[1 2 5 6] [3 4 7 8]]
numpy.vstack
numpy.vstack — удобная обёртка над numpy.concatenate, используемая для вертикального объединения массивов вдоль первой оси (axis=0).
numpy.vstack автоматически преобразует одномерные массивы в двумерные векторы-строки, а затем объединяет их по вертикали, что эквивалентно numpy.concatenate([numpy.atleast_2d(arr) for arr in arrays], axis=0).
Пример
Результат вывода:
第一个数组: [[1 2] [3 4]] 第二个数组: [[5 6] [7 8]] 竖直堆叠: [[1 2] [3 4] [5 6] [7 8]]
Разделение массивов
| Функция | Массив и операция |
|---|---|
split |
Разделить массив на несколько подмассивов. |
hsplit |
Разделить массив горизонтально на несколько подмассивов (по столбцам). |
vsplit |
Разделить массив вертикально на несколько подмассивов (по строкам). |
numpy.split
Функция numpy.split разбивает массив на подмассивы вдоль определенной оси. Формат следующий:
numpy.split(ary, indices_or_sections, axis)
Описание параметра:
ary: массив, который нужно разбитьindices_or_sections: если это целое число, массив разбивается на это число равных частей; если это массив, он задает позиции вдоль оси, по которым нужно разбить (левый открытый, правый закрытый).axis: задает направление, вдоль которого нужно разбить. По умолчанию 0 — горизонтальное разбиение, т.е. горизонтальное направление. Если 1 — вертикальное разбиение, т.е. вертикальное направление.
Пример
Результат вывода:
第一个数组: [0 1 2 3 4 5 6 7 8] 将数组分为三个大小相等的子数组: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])] 将数组在一维数组中表明的位置分割: [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
Когда axis равен 0, разбиение выполняется в горизонтальном направлении; когда axis равен 1 — в вертикальном направлении:
Пример
a = np.arange(16).reshape(4, 4)
print('Первый массив:')
print(a)
print('\n')
print('Разбиение по умолчанию (axis 0):')
b = np.split(a,2)
print(b)
print('\n')
print('Разбиение вдоль горизонтального направления:')
c = np.split(a,2,1)
print(c)
print('\n')
print('Разбиение вдоль горизонтального направления:')
d= np.hsplit(a,2)
print(d)
Результат вывода:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
默认分割(0轴):
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
沿水平方向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
沿水平方向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
numpy.hsplit
Функция numpy.hsplit используется для разделения массива по горизонтали путем указания количества возвращаемых массивов одинаковой формы.
Пример
Результат вывода:
原array:
[[4. 7. 6. 3. 2. 6.]
[6. 3. 6. 7. 9. 7.]]
拆分后:
[array([[4., 7.],
[6., 3.]]), array([[6., 3.],
[6., 7.]]), array([[2., 6.],
[9., 7.]])]
numpy.vsplit
numpy.vsplit выполняет разбиение по вертикальной оси, и его метод разбиения такой же, как использование hsplit.
Пример
Результат вывода:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
竖直分割:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
Добавление и удаление элементов массива
| Функция | Элемент и описание |
|---|---|
resize |
Возвращает новый массив указанной формы. |
append |
Добавить значения в конец массива. |
insert |
Вставить значения перед указанными индексами вдоль указанной оси. |
delete |
Удалить подмассив вдоль определённой оси и вернуть новый массив после удаления. |
unique |
Найти уникальные элементы в массиве. |
numpy.resize
Функция numpy.resize возвращает новый массив указанного размера.
Если новый массив больше исходного размера, он содержит копии элементов из исходного массива.
numpy.resize(arr, shape)
Описание параметра:
arr: массив, размер которого нужно изменитьshape: новая форма возвращаемого массива
Пример
Результат вывода:
第一个数组: [[1 2 3] [4 5 6]] 第一个数组的形状: (2, 3) 第二个数组: [[1 2] [3 4] [5 6]] 第二个数组的形状: (3, 2) 修改第二个数组的大小: [[1 2 3] [4 5 6] [1 2 3]]
numpy.append
Функция numpy.append добавляет значения в конец массива. Операция append выделяет память под весь массив и копирует исходный массив в новый массив. Кроме того, размерности входных массивов должны совпадать; в противном случае будет вызвана ошибка ValueError.
Функция append всегда возвращает одномерный массив.
numpy.append(arr, values, axis=None)
Описание параметра:
arr: входной массивvalues: к чему добавлятьarrДобавляемое значение должно бытьarrтой же формы (кроме оси, по которой добавляется)axis: по умолчанию None. Если axis не указан, выполняется горизонтальное добавление, и возвращаемый результат всегда одномерный массив! Если axis указан, это соответственно 0 и 1. Если axis указан, это соответственно 0 и 1 (количество столбцов должно совпадать). Если axis равен 1, массив добавляется справа (количество строк должно совпадать).
Пример
Результат вывода:
第一个数组: [[1 2 3] [4 5 6]] 向数组添加元素: [1 2 3 4 5 6 7 8 9] 沿轴 0 添加元素: [[1 2 3] [4 5 6] [7 8 9]] 沿轴 1 添加元素: [[1 2 3 5 5 5] [4 5 6 7 8 9]]
numpy.insert
Функция numpy.insert вставляет значения во входной массив вдоль заданной оси перед заданными индексами.
Функция вставляет заданные значения или массивы в указанные позиции (или массив позиций), а затем возвращает новый массив. Вставляемые элементы могут быть скалярными значениями или массивами. Обратите внимание, что операция вставки возвращает новый массив и не изменяет исходный массив.
numpy.insert(arr, obj, values, axis)
Описание параметра:
arr: входной массивobj: индекс, перед которым вставляются значенияvalues: значения, которые нужно вставитьaxis: ось, вдоль которой выполняется вставка; если не указана, входной массив уплощается.
Пример
Результат вывода следующий:
第一个数组: [[1 2] [3 4] [5 6]] 未传递 Axis 参数。 在删除之前输入数组会被展开。 [ 1 2 3 11 12 4 5 6] 传递了 Axis 参数。 会广播值数组来配输入数组。 沿轴 0 广播: [[ 1 2] [11 11] [ 3 4] [ 5 6]] 沿轴 1 广播: [[ 1 11 2] [ 3 11 4] [ 5 11 6]]
numpy.delete
Функция numpy.delete возвращает новый массив, из которого удалён указанный подмассив. Как и в функции insert(), если параметр axis не указан, входной массив преобразуется в одномерный.
Numpy.delete(arr, obj, axis)
Описание параметра:
arr: входной массивobj: может быть срезом, целым числом или целочисленным массивом, указывающим подмассив, который нужно удалить из входного массива.axis: ось, вдоль которой удаляется указанный подмассив; если не указана, входной массив преобразуется в одномерный.
Пример
Результат вывода:
第一个数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 未传递 Axis 参数。 在插入之前输入数组会被展开。 [ 0 1 2 3 4 6 7 8 9 10 11] 删除第二列: [[ 0 2 3] [ 4 6 7] [ 8 10 11]] 包含从数组中删除的替代值的切片: [ 2 4 6 8 10]
numpy.unique
Функция numpy.unique используется для удаления дублирующихся элементов из массива.
numpy.unique(arr, return_index, return_inverse, return_counts)
arr: входной массив; если он не является одномерным массивом, он будет уплощён.return_index: если этоtrue, вернуть позиции (индексы) элементов нового списка в старом списке и сохранить их в виде списка.return_inverse: если этоtrueВозвращает позиции (индексы) элементов старого списка в новом списке и сохраняет их в виде списка.return_countsЕсли он равенtrueВозвращает количество вхождений элементов дедуплицированного массива в исходном массиве
Пример
Результат вывода:
第一个数组: [5 2 6 2 7 5 6 8 2 9] 第一个数组的去重值: [2 5 6 7 8 9] 去重数组的索引数组: [1 0 2 4 7 9] 我们可以看到每个和原数组下标对应的数值: [5 2 6 2 7 5 6 8 2 9] 去重数组的下标: [2 5 6 7 8 9] 下标为: [1 0 2 0 3 1 2 4 0 5] 使用下标重构原数组: [5 2 6 2 7 5 6 8 2 9] 返回去重元素的重复数量: [2 5 6 7 8 9] [3 2 2 1 1 1]Другие расширения