Site icon 8HOST.COM

Добавление элементов в массив в Python

В Python нет встроенного типа данных “массив”, но есть модули, которые позволяют работать с массивами. В этой статье мы рассмотрим, как добавлять данные в массив с помощью модулей array и NumPy. Модуль array полезен, когда нужно создать массив целых чисел и чисел с плавающей точкой. А модуль NumPy пригодится, когда вам нужно выполнить математические операции с массивом.

Во многих случаях создать массив вы можете с помощью List, поскольку он обеспечивает гибкость (например смешанные типы данных) и по-прежнему обладает всеми характеристиками массива.

Читайте также: Работа со списками в Python 3

Примечание: в массив можно добавлять только элементы одного типа данных. Соответственно, объединять можно только два массива с одинаковым типом данных.

Добавление элементов в массив

С помощью модуля array можно объединять массивы при помощи оператора + и добавлять элементы в массив методами append(), extend() и insert().

В следующем примере показано, как создать новый объект массива путем объединения двух других массивов:

import array

# create array objects, of type integer
arr1 = array.array('i', [1, 2, 3])
arr2 = array.array('i', [4, 5, 6])

# print the arrays
print("arr1 is:", arr1) 
print("arr2 is:", arr2)

# create a new array that contains all of the elements of both arrays 
# and print the result
arr3 = arr1 + arr2
print("After arr3 = arr1 + arr2, arr3 is:", arr3)

Получим следующий вывод:

arr1 is: array('i', [1, 2, 3])
arr2 is: array('i', [4, 5, 6])
After arr3 = arr1 + arr2, arr3 is: array('i', [1, 2, 3, 4, 5, 6])

В предыдущем примере создается новый массив, в котором содержатся все элементы заданных массивов.

А в следующем примере показано, как добавлять данные в массив с помощью методов append(), extend() и insert():

import array

# create array objects, of type integer
arr1 = array.array('i', [1, 2, 3])
arr2 = array.array('i', [4, 5, 6])

# print the arrays
print("arr1 is:", arr1) 
print("arr2 is:", arr2)

# append an integer to an array and print the result
arr1.append(4)
print("\nAfter arr1.append(4), arr1 is:", arr1)

# extend an array by appending another array of the same type 
# and print the result
arr1.extend(arr2)
print("\nAfter arr1.extend(arr2), arr1 is:", arr1)

# insert an integer before index position 0 and print the result
arr1.insert(0, 10)
print("\nAfter arr1.insert(0, 10), arr1 is:", arr1)

Получаем следующий вывод:

arr1 is: array('i', [1, 2, 3])
arr2 is: array('i', [4, 5, 6])

After arr1.append(4), arr1 is: array('i', [1, 2, 3, 4])

After arr1.extend(arr2), arr1 is: array('i', [1, 2, 3, 4, 4, 5, 6])
After arr1.insert(0, 10), arr1 is: array('i', [10, 1, 2, 3, 4, 4, 5, 6])

В предыдущем примере каждый метод вызывается на объекте массива arr1 и изменяет исходный объект.

Добавление элементов в массив NumPy

С модулем NumPy вы можете использовать функции NumPy append() и insert() для добавления элементов в массив.

numpy.append() использует функцию numpy.concatenate() в фоновом режиме. Метод numpy.concatenate() объединяет последовательность массивов вдоль указанной оси. Узнать больше о работе с массивами вы можете в документации NumPy.

Примечание: для тестирования примеров кода в этом разделе необходимо установить NumPy.

Примеры на этом этапе используют двумерные (2D) массивы, чтобы показать, как функции обрабатывают массивы в зависимости от значения axis.

Добавление в массив с помощью numpy.append()

Массивы NumPy можно описать по размеру и форме. При добавлении значений или массивов в многомерные массивы добавляемый массив или значения должны иметь одинаковую форму, за исключением указанной оси.

Чтобы понять форму 2D массива, рассмотрим строки и столбцы. array([[1, 2], [3, 4]]) имеет форму 2, 2, эквивалентную 2 строкам и 2 столбцам; array([[10, 20, 30], [40, 50, 60]] ) имеет форму 2, 3, эквивалентную 2 строкам и 3 столбцам.

Протестируйте эту концепцию с помощью интерактивной консоли Python.

Читайте также: Использование интерактивной консоли Python

Сначала импортируйте модуль NumPy, затем создайте несколько массивов и проверьте их форму.

Импортируйте NumPy, затем создайте и выведите np_arr1:

import numpy as np
np_arr1 = np.array([[1, 2], [3, 4]])
print(np_arr1)

Получим следующий вывод:

[[1 2]
 [3 4]]

Проверьте форму np_arr1:

np_arr1.shape
(2, 2)

Создайте и выведите ещё один массив, np_arr2:

np_arr2 = np.array([[10, 20, 30], [40, 50, 60]])
print(np_arr2)
[[10 20 30]
 [40 50 60]]

Проверьте форму np_arr2:

np_arr2.shape
(2, 3)

Затем попробуйте добавить массивы по разным осям. Вы можете добавить массив формы 2, 3 к массиву формы 2, 2 вдоль оси 1, но не вдоль оси 0.

Добавьте np_arr2 к np_arr1 вдоль axis 0 или по строкам:

np.append(np_arr1, np_arr2, axis=0)

Вы получите ошибку ValueError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<__array_function__ internals>", line 5, in append
  File "/Users/digitalocean/opt/anaconda3/lib/python3.9/site-packages/numpy/lib/function_base.py", line 4817, in append
    return concatenate((arr, values), axis=axis)
  File "<__array_function__ internals>", line 5, in concatenate
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 2 and the array at index 1 has size 3

Выполнить добавление массива с тремя столбцами в массив с двумя столбцами невозможно.

Вы можете добавить массив np_arr2 к np_arr1 вдоль оси 1, то есть по столбцам:

np.append(np_arr1, np_arr2, axis=1)

Вывод будет следующим:

array([[ 1,  2, 10, 20, 30],
       [ 3,  4, 40, 50, 60]])

Вы можете добавить массив со столбцами высотой в две строки к другому массиву со столбцами высотой в две строки.

В следующем примере показано, как добавлять элементы в массив NumPy с помощью функции numpy.append():

import numpy as np

# create 2D array objects (integers)
np_arr1 = np.array([[1, 2], [3, 4]])
np_arr2 = np.array([[10, 20], [30, 40]])

# print the arrays
print("np_arr1 is:\n", np_arr1)
print("np_arr2 is:\n", np_arr2)

# append an array to the end of another array and print the result
# both arrays are flattened before appending
append_axis_none = np.append(np_arr1, np_arr2, axis=None)
print("append_axis_none is:\n", append_axis_none)

# append an array to the end of another array along axis 0 (append rows)
# and print the result
append_axis_0 = np.append(np_arr1, np_arr2, axis=0)
print("append_axis_0 is:\n", append_axis_0)

# append an array to the end of another array along axis 1 (append columns)
# and print the result
append_axis_1 = np.append(np_arr1, np_arr2, axis=1)
print("append_axis_1 is:\n", append_axis_1)

Получаем следующий вывод:

np_arr1 is:
 [[1 2]
 [3 4]]
np_arr2 is:
 [[10 20]
 [30 40]]
append_axis_none is:
 [ 1  2  3  4 10 20 30 40]
append_axis_0 is:
 [[ 1  2]
 [ 3  4]
 [10 20]
 [30 40]]
append_axis_1 is:
 [[ 1  2 10 20]
 [ 3  4 30 40]]

Предыдущий пример демонстрирует работу функции numpy.append() для каждой оси 2D-массива и как изменяется форма полученного массива. Если ось равна 0, массив дополняется строками. Если ось равна 1, массив дополняется столбцами.

Добавление элементов в массив с помощью numpy.insert()

Функция numpy.insert() вставляет массив или значения в другой массив перед указанным индексом вдоль оси и возвращает новый массив.

В отличие от функции numpy.append(), если ось не указана или указана как None, то функция numpy.insert() сглаживает только первый массив и не сглаживает значения или массив, которые нужно вставить. Если вы попытаетесь вставить 2D-массив в другой 2D-массив без указания оси, то вы получите ошибку ValueError.

В следующем примере показано, как вставлять элементы в массив с помощью функции numpy.insert():

import numpy as np

# create array objects (integers)
np_arr1 = np.array([[1, 2], [4, 5]])
np_arr2 = np.array([[10, 20], [30, 40]])
np_arr3 = np.array([100, 200, 300])

# print the arrays
print("np_arr1 is:\n", np_arr1)
print("np_arr2 is:\n", np_arr2)
print("np_arr3 is:\n", np_arr3)

# insert a 1D array into a 2D array and then print the result
# the original array is flattened before insertion
insert_axis_none = np.insert(np_arr1, 1, np_arr3, axis=None)
print("insert_axis_none is:\n", insert_axis_none)

# insert an array into another array by row
# and print the result
insert_axis_0 = np.insert(np_arr1, 1, np_arr2, axis=0)
print("insert_axis_0 is:\n", insert_axis_0)

# insert an array into another array by column
# and print the result
insert_axis_1 = np.insert(np_arr1, 1, np_arr2, axis=1)
print("insert_axis_1 is:\n", insert_axis_1)

Вывод будет следующим:

np_arr1 is:
 [[1 2]
 [4 5]]
np_arr2 is:
 [[10 20]
 [30 40]]
insert_axis_none is:
 [  1 100 200 300   2   4   5]
insert_axis_0 is:
 [[ 1  2]
 [10 20]
 [30 40]
 [ 4  5]]
insert_axis_1 is:
 [[ 1 10 30  2]
 [ 4 20 40  5]]

В предыдущем примере, когда вы вставляли 2D-массив в другой 2D-массив вдоль оси 1, каждый массив в np_arr2 был вставлен как отдельный столбец в np_arr1. Если вы хотите вставить целый 2D-массив в другой 2D-массив, добавьте квадратные скобки вокруг значения obj, чтобы указать, что весь массив должен быть вставлен перед этой позицией. Без квадратных скобок numpy.insert() складывает массивы по порядку в виде столбцов перед заданным индексом.

В следующем примере показан вывод с квадратными скобками вокруг значения параметра obj (index) и без них:

import numpy as np

# create 2D array objects (integers)
np_arr1 = np.array([[1, 2], [3, 4]])
np_arr2 = np.array([[10, 20], [30, 40]])

# print the arrays
print("np_arr1 is:\n", np_arr1)
print("np_arr2 is:\n", np_arr2)

# insert an array, column by column, into another array
# and print the result
insert_axis_1 = np.insert(np_arr1, 1, np_arr2, axis=1)
print("insert_axis_1 is:\n", insert_axis_1)

# insert a whole array into another array by column
# and print the result
insert_index_axis_1 = np.insert(np_arr1, [1], np_arr2, axis=1)
print("insert_index_axis_1 is:\n", insert_index_axis_1)

Вы получите следующий вывод:

np_arr1 is:
 [[1 2]
 [3 4]]
np_arr2 is:
 [[10 20]
 [30 40]]
insert_axis_1 is:
 [[ 1 10 30  2]
 [ 3 20 40  4]]
insert_index_axis_1 is:
 [[ 1 10 20  2]
 [ 3 30 40  4]]

В предыдущем примере показано, как numpy.insert() вставляет столбцы в массив в зависимости от обозначенного index.

Подводим итоги

В этом мануале мы добавили элементы в массивы с помощью модулей array и NumPy.