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

Как скопировать двумерный массив python

  • автор:

Запись двумерного массива в одномерный python

Красиво сделал, я думал также только я писал справа на лево, и мне писало что оно хз что такое b. Красавчик.

13 мая 2021 в 14:51

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] print(sum(matrix, [])) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

Отслеживать
ответ дан 18 сен 2021 в 14:47
андрей шадрин андрей шадрин
41 3 3 бронзовых знака

добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править

18 сен 2021 в 14:48

Вот пример кода:

l = [elem[0] for elem in l] 

Если во вложенных списка больше 1 элемента то так:

answer = [] for i in l: answer.append(i) 

Отслеживать
ответ дан 17 мая 2020 в 9:28
BigCubeCat BigCubeCat
740 6 6 серебряных знаков 20 20 бронзовых знаков

Преобразование двумерного массива в одномерный:

arr = [[2, 0, 0], [3, 0, 9], [4, 7, 6], [5, 1, 3]] x = len(arr[0]) y = len(arr) lst = [] for i in range(y): for j in arr[i]: lst.append(j) lst 
[2, 0, 0, 3, 0, 9, 4, 7, 6, 5, 1, 3] 

Отслеживать
ответ дан 2 апр 2021 в 11:59
466 1 1 золотой знак 6 6 серебряных знаков 20 20 бронзовых знаков

l = [[2], [3], [4], [5]] l = list((np.array(l)).reshape(4,)) 

Отслеживать
1,707 1 1 золотой знак 5 5 серебряных знаков 21 21 бронзовый знак
ответ дан 3 фев 2022 в 7:45
Михаил Титов Михаил Титов
1 1 1 бронзовый знак

добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править

3 фев 2022 в 7:46

У numpy есть методы «выпрямления» массивов без указания конкретного размера: ravel() и flatten() . Ну и использовать numpy тут как из пушки по воробьям. )

3 фев 2022 в 8:26
А без numpy в несколько строчек расписывать циклом лучше?
4 фев 2022 в 9:44

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Копирование массива в Python. Метод copy для копирования массива. Представление массива

В этой статье мы поговорим, как скопировать массив в Python и чем копирование массива отличается от представления массива. Также рассмотрим поверхностное и глубокое копирование объектов в Python.

Работая с массивами в Python, вы наверняка сталкивались с ситуацией, когда при использовании некоторых функций, возвращающих какой-нибудь результат, с исходным массивом не происходит ничего. Как в примере ниже:

1-20219-f8d3c0.png

Всё дело в том, что в библиотеке NumPy есть два понятия касаемо массива: копия и представление. И это разные вещи. Посмотрите на код ниже:

2-20219-ac53bc.png

На самом деле, всё просто. Когда мы выполняем присваивание b = a, никакого копирования данных на деле не происходит. В памяти компьютера всё так же один массив, а переменные a и b — это даже не переменные, а указатели, указывающие на одни и те же данные. Таким образом, мы обращаемся по разным указателям к одним и тем же данным в памяти и видим в результате одно и то же.

Хорошо, a и b являются указателями, но что тогда с переменной с? На деле, это тоже указатель, ссылающийся на ту же область памяти с данными, правда, представлены эти данные в иной форме. Вот мы и подошли к понятию представления массива, которое существует в NumPy. Действительно, те же данные можно представить в разной форме:

3-20219-db3c11.png

На деле, можно говорить о копировании, если данные в памяти компьютера физически копируются в другое место. Но, как мы уже убедились, операция присваивания копирование не выполняет. Также мы поняли, что те же самые данные могут иметь различные представления.

Присваивание не копирует массивы в Python

Итак, простое присваивание никаких копий массива не выполняет, и это первое, что стоит уяснить. Может показаться, что это всего лишь прихоть создателей Python и NumPy, но всё не так просто. Если бы ситуация обстояла иначе, мы бы работали с памятью напрямую, а отсутствие автоматического копирования во время присваивания — совсем небольшая плата за лёгкость и простоту языка программирования Python.

Давайте приведём ещё парочку примеров на эту тему:

4-20219-d1cff3.png

Обратите внимание, что массивы a и b в действительности являются одним и тем же массивом с такими же данными и типом данных.

5-20219-e6b725.png

Таким образом, у нас есть массив b и массив a, но нельзя забывать о том, что это, по сути, один и тот же массив.

Так как же копировать массивы в Python?

Чтобы сделать полную копию массива в Python, используют метод copy. Он выполняет копирование не только данных массива, но и всех его свойств.

6-20219-11ccc2.png

После применения метода copy мы можем говорить о массивах a и b, как о разных массивах и копиях друг друга. Да, эти массивы имеют одинаковые данные, но эти данные не являются одними и теми же. Теперь действительно массив b является копией массива a, и именно это называется копированием массива в терминологии NumPy.

Представление массива

Итак, теперь мы знаем, как сделать копию массива посредством метода copy. Но бывают ситуации, когда нам не нужна копия массива, а нужен тот же массив но с иными размерами. Речь идёт, как вы уже догадались, о другом представлении исходного массива.

Для этих целей в NumPy есть метод ndarray.view() . Он создаёт новый объект массива, просматривающий данные исходного, однако изменение размеров одного массива не приводит к изменению размеров другого.

7-20219-fddf6c.png

Обычно, функции которые меняют форму и порядок элементов в Пайтон-массивах возвращают не копию массива, а именно его представление:

8-20219-293d68.png

Также представлениями массивов в Python являются срезы массивов:

9-20219-494f8d.png

Обратите внимание, что когда мы говорим о том, что массив b является представлением массива a, мы подразумеваем, что вне зависимости от вида и формы массива b он включает в себя те же данные в памяти, что и наш массив a. Таким образом, изменение элементов в одном из массивов приведёт, соответственно, к изменениям в другом.

Глубокое и поверхностное копирование объектов с помощью copy

Как мы уже хорошо уяснили, операция присваивания не приводит к копированию объекта, а лишь создаёт ссылку на этот объект. Но если мы работаем с изменяемыми коллекциями или коллекциями, которые содержат изменяемые элементы, нам может понадобиться такая копия, которую мы сможем изменить, не меняя оригинал. Здесь нам тоже поможет copy, выполняющий как поверхностное, так и глубокое копирование: • copy.copy(a) — возвращает поверхностную копию a; • copy.deepcopy(a) — возвращает полную копию a.

Если же объект скопировать невозможно, возникает исключение copy.error. В принципе, разница между глубоким и поверхностным копированием существенна лишь для составных объектов, которые содержат изменяемые объекты (допустим, список списков). При этом: 1) поверхностная копия позволяет создать новый составной объект, а потом (если это возможно) вставляет в него ссылки на объекты, которые находятся в оригинале; 2) глубокая копия позволяет создать новый составной объект, а потом рекурсивно вставляет в него копии объектов, которые находятся в оригинале.

 
>>> import copy >>> test_1 = [1, 2, 3, [1, 2, 3]] >>> test_copy = copy.copy(test_1) >>> print(test_1, test_copy) [1, 2, 3, [1, 2, 3]] [1, 2, 3, [1, 2, 3]] >>> test_copy[3].append(4) >>> print(test_1, test_copy) [1, 2, 3, [1, 2, 3, 4]] [1, 2, 3, [1, 2, 3, 4]] >>> test_1 = [1, 2, 3, [1, 2, 3]] >>> test_deepcopy = copy.deepcopy(test_1) >>> test_deepcopy[3].append(4) >>> print(test_1, test_deepcopy) [1, 2, 3, [1, 2, 3]] [1, 2, 3, [1, 2, 3, 4]]

При выполнении глубокого копирования возможны проблемы (их нет у поверхностного копирования): — рекурсивные объекты могут привести к рекурсивному циклу; — т. к. глубокая копия копирует всё, она способна скопировать слишком много, к примеру, административные структуры данных.

Однако в случае возникновения проблем нам поможет функция deepcopy, которая устраняет эти сложности: — посредством хранения "memo" словаря объектов; — позволяя классам, которые определяет пользователь, переопределять операцию копирования либо набор копируемых компонентов.

 
>>> r = [1, 2, 3] >>> r.append(r) >>> print(r) [1, 2, 3, [. ]] >>> p = copy.deepcopy(r) >>> print(p) [1, 2, 3, [. ]]

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

Что же, теперь, надеемся, вы получили представление о копировании массивов и объектов в Python. Если хотите знать больше, к вашим услугам специализированный курс для продвинутых разработчиков:

Как создать копию двумерного списка

Как проще всего создать копию многомерного списка в Python 3?
Пусть мы имеем список А и нам надо создать список В, все элементы которого такие же как у списка А.

Как сделать копию списка с вложенными списками?
Добрый день. Столкнулся с необъяснимым результатом при клонировании листа. В этой книжке.

Создать список с элементами - вывод двумерного списка
Создать список с элементами akn=n f ( k ) + sin ( k ) g (n), где k, n =1, 2, 3, 4;.

107 / 104 / 34
Регистрация: 25.04.2012
Сообщений: 242

Лучший ответ

Сообщение было отмечено Welemir1 как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import copy def print_m(A, N, M): print() for i in range(N): for j in range(M): print(A[i][j], end=' ') print() # main () A = [ [1, 2, 3], [4, 5, 6] ] print_m(A, 2, 3) # создадим копию A B = copy.deepcopy(A) print_m(B, 2, 3) # изменим только элемент у списка A A[0][0] = 0 # и ура! неожиданность: элемент B [0][0] не изменился. print_m(B, 2, 3)

Если кратенько, то

Список – это всего лишь массив указателей на содержимое, поэтому мелкая копия просто копирует указатели, поэтому у вас есть два разных списка, но они имеют одинаковое содержимое. Чтобы сделать копии содержимого, вам нужна глубокая копия.

1525 / 494 / 58
Регистрация: 10.04.2009
Сообщений: 8,361

ЦитатаСообщение от MSP_cyber Посмотреть сообщение

копию двумерного списка
она что от обычного отличается?
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305

B = [row[:] for row in A]

Регистрация: 29.03.2015
Сообщений: 94
Ципихович Эндрю,
раз копия, то отличается. Два разных списка с одинаковым содержимым.
1525 / 494 / 58
Регистрация: 10.04.2009
Сообщений: 8,361
я про то, одномерный список, двумерный список, а если я не знаю какой??
Регистрация: 29.03.2015
Сообщений: 94
ioprst,

B = [row[:] for row in A]

Получается так, что копируем не только как-бы элементы списка, но и внутренность их.

for row in A - просматривает один за другим элементы A, а
row [:] делает их копию.

1 2 3
B = [] for a in A : B += [a [:]]

Добавлено через 4 минуты
Ципихович Эндрю,
я про то, одномерный список, двумерный список, а если я не знаю какой??

Пока не врубаюсь.
Чётко известно, что список двумерный.

1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6

MSP_cyber, Путаница происходит из за того, что при двух разных действиях копией называют и то и другое.
Список (например A ) является как и любой список объектом в оперативной памяти (ОП).
Но уже это утверждение нужно пояснить исходя из особенности питона.
Когда мы говорим список А, то на самом деле А это не список, а переменная питона.
И даже содержимое переменной (это особенность питона) не является списком.
Итак, есть некоторый объект питона, являющийся списком. Этот объект, при выполнении кода, размещается в оперативной памяти и имеет конкретный адрес. Так вот, переменная А содержит ссылку по этому адресу на объект в памяти, являющийся списком.
В свою очередь элементы списка имеют названия (переменные) которые в свою очередь ссылаются на некоторые области в памяти содержащие объекты списки.
А теперь посмотрим, что происходит при присвоении B = A ,
переменной B присваивается ссылка из переменной A на список в ОП ( то есть список один, а ссылки на него из двух переменных).
Если же мы используем B = A[:] , то в ОП создается новый объект-список, который копируется из исходного списка. Но в новом списке элементы, это имена переменных из исходного списка, которые содержат ссылки на те же вложенные списки, на которые ссылаются элементы списка A.
Поэтому если Мы будем изменять вложенный список из списка А, то изменится и вложенный список из списка В.
Глубокое копирование deepcopy отличается тем, что создает новые объекты=списки в ОП не только для списка А, но и для всех вложенных списков. Аналог того что происходит при deepcopy показал ioprst.
В результате мы получаем не только новый базовый список В в оперативной памяти но и новые вложенные списки.
В результате список А и список В становятся абсолютно не зависимыми друг от друга.
Опять я много написал. Извините.

Как в двумерном массиве переписать элементы каждой строки в обратном порядке?

6093cf1440e7e343322086.png

Как в каждой строке переставить элементы в обратном порядке?

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

Комментировать

Решения вопроса 2

alexbprofit @alexbprofit

array = [[3,4],[1,11],[2,5],[6,7]] for elem in array: elem.reverse() print(array)

Ответ написан более двух лет назад

alexbprofit @alexbprofit

[[4, 3], [11, 1], [5, 2], [7, 6]]

MinTnt

lst = [. двумерный массив. ] lst = [x[::-1] for x in lst]

Ответ написан более двух лет назад

Комментировать

Нравится Комментировать

Ответы на вопрос 0

Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +1 ещё

Почему текстовый редактор и консоль по-разному присваивают ссылки на переменные Python?

  • 1 подписчик
  • минуту назад
  • 3 просмотра

python

  • Python
  • +1 ещё

Как сделать форму с добавлением нескольких элементов на django?

  • 1 подписчик
  • 3 часа назад
  • 24 просмотра

python

  • Python
  • +1 ещё

Почему callback_query_handler не видит call.data?

  • 1 подписчик
  • 4 часа назад
  • 26 просмотров

python

  • Python

При выводе users_cards выводится [, . ] как это исправить?

  • 1 подписчик
  • 5 часов назад
  • 33 просмотра

python

  • Python

В приложении django 4.2 + django rest framework: Model.__str__ нужен только для админки?

  • 1 подписчик
  • 8 часов назад
  • 41 просмотр

python

  • Python
  • +1 ещё

Не правильная проверка ячейки таблицы через цикл, почему не записывается переменная?

  • 1 подписчик
  • 8 часов назад
  • 33 просмотра

python

  • Python

Почему падает бот?

  • 1 подписчик
  • 20 часов назад
  • 73 просмотра

python

  • Python
  • +1 ещё

Почему я не могу вставить спецсимволы(смайлы) через админку Django?

  • 1 подписчик
  • 21 час назад
  • 36 просмотров

python

  • Python
  • +2 ещё

Как правильно трансформировать данные к нормальному распределению?

  • 1 подписчик
  • 23 часа назад
  • 39 просмотров

python

  • Python
  • +2 ещё

Как получать id канала отправленного боту через KeyboardButtonRequestChat?

  • 1 подписчик
  • 23 часа назад
  • 25 просмотров

от 120 000 ₽

от 120 000 до 240 000 ₽

ATI.SU • Санкт-Петербург

от 170 000 до 260 000 ₽

19 нояб. 2023, в 19:32

15000 руб./за проект

19 нояб. 2023, в 19:30

130000 руб./за проект

19 нояб. 2023, в 19:18

45000 руб./за проект

Минуточку внимания

Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями

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

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