【问题标题】:Copy xarray into larger xarray in python?在python中将xarray复制到更大的xarray?
【发布时间】:2021-06-28 15:23:05
【问题描述】:

我有一个形状为 [3,] 的 xarray,看起来像这样

data= [2,4,6]

我正在尝试将它复制到数组中,使其看起来像这样:

data= [[2,4,6],[2,4,6],[2,4,6]] (即整个数组被复制了三遍)。

我尝试了几种不同的方法,但不断得到:

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

有人知道我应该怎么做吗? (另外,对不起,如果我没有按照堆栈溢出规则写这个,这是我的第一个问题......)

【问题讨论】:

  • 我不确定现有的答案是否能满足您的真正需求。当您说“将其复制到数组中”时,您必须更加精确。 “数组”是什么意思?你的意思是一个标准的 Python 列表,还是别的什么?此外,您是要创建原始数组的三个新的唯一副本,还是只在新结构中引用现有数组三次?现有的答案都创建了一个标准的 Python 列表,实际上并没有复制数据,而是仅仅引用它 3 次,所以如果你改变一个数组中的一个值,它会在所有数组中改变。

标签: python python-xarray


【解决方案1】:

前两个答案实际上并没有复制原始数组/列表。相反,它们都只是在一个新列表中引用了该数组三次。如果您更改原始数组中的一个值或新列表中的任何“副本”,则数组的所有“副本”都会更改,因为它们实际上都是相同的结构,只是在多个地方引用.

如果您想创建一个包含原始数组(xarray 或列表)的三个唯一副本的列表,您可以这样做:

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

或者如果您想要一个包含原始数组的新 xarray:

new_array = xarray.DataArray([data[:] for _ in range(3)])

【讨论】:

  • 做到了!谢谢!
【解决方案2】:

我认为最安全的方法是:

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

【讨论】:

  • 这个例子产生NameError: name 'lst' is not defined。一旦通过用data 替换lst 来解决这个问题,这种方法的“最安全”是什么?它遇到了与前两个答案相同的问题……它不复制原始数组,而只是创建对原始数组的引用列表。至少在前两个答案中,这一事实是显而易见的。用你的,很难说出发生了什么。但最终,您的复杂答案会产生与 res = [data] * 3 完全相同的结果。
  • 因此,与提供相同结果的类似答案(即参考而不是复制)相比,您对我的错字答案投了反对票。好的
  • 不,我否决了您的答案,因为它增加了大量不必要的复杂性。这就是为什么我问你它的目的是什么……什么是更“安全”的。如果您可以用有效的解释来更新您的答案,说明为什么您的方法比其他方法更安全,并且如果我同意您的观点,那么我会删除我的反对票。否则,增加的复杂性肯定是负面的,因为它没有比更简单的方法增加任何价值,并且难以阅读和理解。 (并且还需要一个额外的模块,而其他模块则不需要)。
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2022-10-22
  • 2016-12-14
  • 2019-09-23
  • 2021-10-29
  • 1970-01-01
  • 2020-09-24
  • 2021-01-11
相关资源
最近更新 更多