Скопировать xarray в больший xarray в Python?

У меня есть массив формы [3,], который выглядит так

data= [2,4,6]

и я пытаюсь скопировать его в массив, чтобы он выглядел так:

data= [[2,4,6],[2,4,6],[2,4,6]] (т.е. весь массив копируется трижды).

Я пробовал несколько разных методов, но продолжаю получать:

data= [2 2 2,4 4 4,6 6 6]

Кто-нибудь знает, как мне это сделать? (Также извините, если я написал это не в соответствии с правилами переполнения стека, это мой первый вопрос ...)


person claire_r    schedule 01.04.2021    source источник
comment
Я не уверен, что существующие ответы дают вам то, что вы действительно хотите. Вы должны быть более точными, когда говорите скопировать его в массив. Что вы имеете в виду под массивом? Вы имеете в виду стандартный список Python или что-то еще? Кроме того, вы хотите создать три новых и уникальных копии исходного массива или просто трижды ссылаться на существующий массив в новой структуре? Существующие ответы создают стандартный список Python и фактически не копируют данные, а просто ссылаются на него три раза, поэтому, если вы измените значение в одном массиве, оно изменится во всех из них.   -  person CryptoFool    schedule 01.04.2021


Ответы (2)


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

Если вы хотите создать список, содержащий три уникальные копии исходного массива (xarray или list), вы можете сделать это:

new_list = [data[:] for _ in range(3)]

или если вам нужен новый xarray, содержащий ваш исходный массив:

new_array = xarray.DataArray([data[:] for _ in range(3)])
person CryptoFool    schedule 01.04.2021
comment
Вот и все! Спасибо! - person claire_r; 01.04.2021

Я думаю, что самым безопасным подходом было бы следующее:

import itertools

data = [2,4,6]
res = list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in [data]))
print(res)

Output: [[2, 4, 6], [2, 4, 6], [2, 4, 6]]
person azal    schedule 01.04.2021
comment
В этом примере получается NameError: name 'lst' is not defined. Как только это будет исправлено заменой lst на data, что является самым безопасным в этом подходе? Он страдает той же проблемой, что и первые два ответа ... он не копирует исходный массив, а просто создает список ссылок на исходный массив. По крайней мере, этот факт очевиден с первыми двумя ответами. С вашим намного сложнее сказать, что происходит. В конце концов, ваш сложный ответ дает тот же результат, что и res = [data] * 3. - person CryptoFool; 01.04.2021
comment
Итак, вы проголосовали против моего ответа за опечатку по сравнению с аналогичными ответами, которые дают тот же результат, то есть ссылку вместо копии. Хорошо - person azal; 01.04.2021
comment
Нет, я отклонил ваш ответ, потому что он добавляет массу ненужной сложности. Вот почему я спросил вас, какова цель этого ... что было в этом безопаснее. Если бы вы могли обновить свой ответ вежливым объяснением того, почему ваш метод более безопасен, чем другие, и если бы я согласился с вами, я бы удалил свой голос против. В противном случае добавленная сложность является определенно отрицательным фактором, учитывая, что она не добавляет ничего ценного по сравнению с более простыми подходами, и ее трудно читать и понимать. (а также требует дополнительного модуля, которого нет у других). - person CryptoFool; 01.04.2021