Копирование, объединение и изменение массивов

Копирование, объединение и изменение массивов#

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]])

См. также#

Более подробная информация на официальном сайте NumPy.