Как объединить массивы python
Перейти к содержимому

Как объединить массивы python

  • автор:

Как объединить массивы в Python (с примерами)

Самый простой способ объединить массивы в Python — использовать функцию numpy.concatenate , которая использует следующий синтаксис:

numpy.concatenate ((a1, a2, ….), ось = 0)

  • a1, a2…: последовательность массивов
  • ось: ось, вдоль которой будут соединяться массивы. По умолчанию 0.

В этом руководстве представлено несколько примеров использования этой функции на практике.

Пример 1: объединение двух массивов

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

import numpy as np #create two arrays arr1 = np.array([1, 2, 3, 4, 5]) arr2 = np.array([6, 7, 8]) #concatentate the two arrays np.concatenate ((arr1, arr2)) [1, 2, 3, 4, 5, 6, 7, 8] 

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

import numpy as np #create two arrays arr1 = np.array([[3, 5], [9, 9], [12, 15]]) arr2 = np.array([[4, 0]]) #concatentate the two arrays np.concatenate ((arr1, arr2), axis= 0 ) array([[3, 5], [9, 9], [12, 15], [4, 0]]) #concatentate the two arrays and flatten the result np.concatenate ((arr1, arr2), axis= None ) array([3, 5, 9, 9, 12, 15, 4, 0]) 

Пример 2. Объединение более двух массивов

Мы можем использовать аналогичный код для объединения более двух массивов:

import numpy as np #create four arrays arr1 = np.array([[3, 5], [9, 9], [12, 15]]) arr2 = np.array([[4, 0]]) arr3 = np.array([[1, 1]]) arr4 = np.array([[8, 8]]) #concatentate all the arrays np.concatenate ((arr1, arr2, arr3, arr4), axis= 0 ) array([[3, 5], [9, 9], [12, 15], [4, 0], [1, 1], [8, 8]]) #concatentate all the arrays and flatten the result np.concatenate ((arr1, arr2, arr3, arr4), axis= None ) array([3, 5, 9, 9, 12, 15, 4, 0, 1, 1, 8, 8]) 

Дополнительные ресурсы

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

Операции с массивами / np 6

Часто требуется создать новый массив на основе уже существующих. В этом разделе речь пойдет о процессе создания массивов за счет объединения или разделения ранее определенных.

Объединение массивов

Можно осуществить слияние массивов для создания нового, который будет содержать все элементы объединенных. NumPy использует концепцию стекинга и предлагает для этого кое-какие функции. Например, можно осуществить вертикальный стекинг с помощью функции vstack() , которая добавит второй массив в первый с помощью новых рядов. А функция hstack() осуществляет горизонтальная стекинг, добавляя второй массив в виде колонок.

>>> A = np.ones((3, 3)) >>> B = np.zeros((3, 3)) >>> np.vstack((A, B)) array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) >>> np.hstack((A,B)) array([[ 1., 1., 1., 0., 0., 0.], [ 1., 1., 1., 0., 0., 0.], [ 1., 1., 1., 0., 0., 0.]]) 

Еще две функции, которые выполняют стекинг для нескольких массивов — это column_stack() и row_stack() . Они работают независимо от первых двух. Их используют для одномерных массивов, для объединения значения в ряды или колонки и формирования двумерного массива.

>>> a = np.array([0, 1, 2]) >>> b = np.array([3, 4, 5]) >>> c = np.array([6, 7, 8]) >>> np.column_stack((a, b, c)) array([[0, 3, 6], [1, 4, 7], [2, 5, 8]]) >>> np.row_stack((a, b, c)) array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) 

Разделение массивов

Из прошлого раздела вы узнали, как собирать массивы с помощью стекинга. Теперь разберемся с разделением их на части. В NumPy для этого используется разделение. Также имеется набор функций, который работают в горизонтальной ( hsplit() ) и вертикальной ( vsplit() ) ориентациях.

>>> A = np.arange(16).reshape((4, 4)) >>> A array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) 

Так, если нужно разбить массив горизонтально, то есть, поделить ширину массива на две части, то матрица A размером 4×4 превратится в две матрицы 2×4.

>>> [B,C] = np.hsplit(A, 2) >>> B array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]) >>> C array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]]) 

Если же нужно разбить массив вертикально, то есть поделить высоту на две части, то матрица A размером 4×4 превратится в 2 размерами 4×2.

>>> [B,C] = np.vsplit(A, 2) >>> B array([[0, 1, 2, 3], [4, 5, 6, 7]]) >>> C array([[ 8, 9, 10, 11], [12, 13, 14, 15]]) 

Более сложная команда — функция split() . Она позволяет разбить массив на несимметричные части. Массив передается в качестве аргумента, но вместе с ним необходимо указать и индексы частей, на которые его требуется разбить. Если указать параметр axis = 1 , то индексами будут колонки, а если axis = 0 — ряды.

Например, необходимо разбить матрицу на три части. Первая из которых будет включать первую колонку, вторая — вторую и третью колонки, а третья — последнюю. Здесь нужно указать следующие индексы.

>>> [A1,A2,A3] = np.split(A,[1,3],axis=1) >>> A1 array([[ 0], [ 4], [ 8], [12]]) >>> A2 array([[ 1, 2], [ 5, 6], [ 9, 10], [13, 14]]) >>> A3 array([[ 3], [ 7], [11], [15]]) 

То же самое можно проделать и для рядов.

>>> [A1,A2,A3] = np.split(A,[1,3],axis=0) >>> A1 array([[0, 1, 2, 3]]) >>> A2 array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> A3 array([[12, 13, 14, 15]]) 

Эта же особенность включает функции vsplit() и hsplit() .

NumPy, часть 2: базовые операции над массивами

Python 3 логотип

Здравствуйте! Я продолжаю работу над пособием по python-библиотеке NumPy.

В прошлой части мы научились создавать массивы и их печатать. Однако это не имеет смысла, если с ними ничего нельзя делать.

Сегодня мы познакомимся с операциями над массивами.

Базовые операции

Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора.

       :1: RuntimeWarning: divide by zero encountered in true_divide    

Для этого, естественно, массивы должны быть одинаковых размеров.

  File 

Также можно производить математические операции между массивом и числом. В этом случае к каждому элементу прибавляется (или что вы там делаете) это число.

NumPy также предоставляет множество математических операций для обработки массивов:

Полный список можно посмотреть здесь.

Многие унарные операции, такие как, например, вычисление суммы всех элементов массива, представлены также и в виде методов класса ndarray.

 

Индексы, срезы, итерации

Одномерные массивы осуществляют операции индексирования, срезов и итераций очень схожим образом с обычными списками и другими последовательностями Python (разве что удалять с помощью срезов нельзя).

           File  У многомерных массивов на каждую ось приходится один индекс. Индексы передаются в виде последовательности чисел, разделенных запятыми (то бишь, кортежами):

Когда индексов меньше, чем осей, отсутствующие индексы предполагаются дополненными с помощью срезов:

b[i] можно читать как b[i, ]. В NumPy это также может быть записано с помощью точек, как b[i, . ].

Например, если x имеет ранг 5 (то есть у него 5 осей), тогда

  • x[1, 2, . ] эквивалентно x[1, 2, :, :, :],
  • x[. , 3] то же самое, что x[:, :, :, :, 3] и
  • x[4, . , 5, :] это x[4, :, :, 5, :].

Итерирование многомерных массивов начинается с первой оси:

Однако, если нужно перебрать поэлементно весь массив, как если бы он был одномерным, для этого можно использовать атрибут flat:

Как уже говорилось, у массива есть форма (shape), определяемая числом элементов вдоль каждой оси:

Форма массива может быть изменена с помощью различных команд:

Порядок элементов в массиве в результате функции ravel() соответствует обычному "C-стилю", то есть, чем правее индекс, тем он "быстрее изменяется": за элементом a[0,0] следует a[0,1]. Если одна форма массива была изменена на другую, массив переформировывается также в "C-стиле". Функции ravel() и reshape() также могут работать (при использовании дополнительного аргумента) в FORTRAN-стиле, в котором быстрее изменяется более левый индекс.

Метод reshape() возвращает ее аргумент с измененной формой, в то время как метод resize() изменяет сам массив:

Если при операции такой перестройки один из аргументов задается как -1, то он автоматически рассчитывается в соответствии с остальными заданными:

Объединение массивов

Несколько массивов могут быть объединены вместе вдоль разных осей с помощью функций hstack и vstack.

hstack() объединяет массивы по первым осям, vstack() — по последним:

Функция column_stack() объединяет одномерные массивы в качестве столбцов двумерного массива:

Аналогично для строк имеется функция row_stack().

Разбиение массива

Используя hsplit() вы можете разбить массив вдоль горизонтальной оси, указав либо число возвращаемых массивов одинаковой формы, либо номера столбцов, после которых массив разрезается "ножницами":

Функция vsplit() разбивает массив вдоль вертикальной оси, а array_split() позволяет указать оси, вдоль которых произойдет разбиение.

Копии и представления

При работе с массивами, их данные иногда необходимо копировать в другой массив, а иногда нет. Это часто является источником путаницы. Возможно 3 случая:

Вообще никаких копий

Простое присваивание не создает ни копии массива, ни копии его данных:

Python передает изменяемые объекты как ссылки, поэтому вызовы функций также не создают копий.

Представление или поверхностная копия

Разные объекты массивов могут использовать одни и те же данные. Метод view() создает новый объект массива, являющийся представлением тех же данных.

Срез массива это представление:

Глубокая копия

Метод copy() создаст настоящую копию массива и его данных:

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Как объединить массивы в один?

У меня есть 200000 массивов, где каждый размерности - (1000, 1000, 3), и все они хранятся в директории
Как мне лучше всего их объединить в один большой массив?

когда делаю так:

numpy_ars = [] for np_name in glob.glob('*.np[yz]'): numpy_ars.append(np.load(np_name)) print(np.array(numpy_ars).shape)

то в какой-то момент получаю sigkill

Как сделать так чтобы все массивы в итоге загрузились в один (200000, 1000, 1000, 3) ?

  • Вопрос задан более двух лет назад
  • 165 просмотров

2 комментария

Простой 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *