Копирование, объединение и изменение массивов#
import numpy as np
Для копирования массиво предназначен метод np.copy
.
Когда его стоит применять?
Если мы возьмём некоторый срез массива a
и сохраним его в b
, а затем выполним над b
какую-нибудь изменяющую операцию (например, +=
), то мы изменим и значения в исходном массиве a
:
a = np.arange(1, 8)
# Просто ссылаемся на участок массива a
b = a[:2]
# Изменяем массив a путём изменения его участка,
# на который ссылается b
b += 1
print("a =", a)
print("b =", b)
a = [2 3 3 4 5 6 7]
b = [2 3]
Часто это не то, чего мы хотим.
Как правило, мы хотим взять срез как независимый массив и работать с ним также независимо.
В этом и помогает метод np.copy
(его имеет каждый экземпляр массива NumPy):
a = np.arange(1, 8)
# Копируем
b = a[:2].copy()
b += 1
print("a =", a)
print("b =", b)
a = [1 2 3 4 5 6 7]
b = [2 3]
Как видите, массив a
не изменился.
Для объединения нескольких массивов в один имеется несколько функций: np.vstack
, np.hstack
и np.block
.
Пример ниже иллюстрирует создание матрицы \(4 \times 4\) из четырёх матриц \(2 \times 2\) с помощью np.block
:
A = np.ones((2, 2))
B = np.eye(2, 2)
C = np.zeros((2, 2))
D = np.diag((-3, -4))
np.block([[A, B], [C, D]])
array([[ 1., 1., 1., 0.],
[ 1., 1., 0., 1.],
[ 0., 0., -3., 0.],
[ 0., 0., 0., -4.]])
Остальные методы объединения массивов имеют аналогичный синтаксис. Примеры их применения можно найти в их документации.
vstack
, hstack
и column_stack
#
Если у вас есть ряд массивов, скажем два, то их можно объединить тремя разными способами:
a = np.random.randint(-10, 11, (3, 4))
b = np.random.randint(11, 50, (3, 4))
print(f"a:\n{a}")
print(f"b:\n{b}")
a:
[[-6 -3 -1 -4]
[ 9 -5 -2 6]
[ 6 9 -1 -9]]
b:
[[44 31 39 17]
[32 33 33 42]
[18 29 44 41]]
np.vstack([a, b])
array([[-6, -3, -1, -4],
[ 9, -5, -2, 6],
[ 6, 9, -1, -9],
[44, 31, 39, 17],
[32, 33, 33, 42],
[18, 29, 44, 41]], dtype=int32)
np.hstack([a, b])
array([[-6, -3, -1, -4, 44, 31, 39, 17],
[ 9, -5, -2, 6, 32, 33, 33, 42],
[ 6, 9, -1, -9, 18, 29, 44, 41]], dtype=int32)
np.column_stack([(1, 2, 3, 4, 5),
(-1, 0, -7, 11, 13),
(0, 1, 100, -500, 15)])
array([[ 1, -1, 0],
[ 2, 0, 1],
[ 3, -7, 100],
[ 4, 11, -500],
[ 5, 13, 15]])