【问题标题】:Shift array to make first and last columns adjacent移动数组以使第一列和最后一列相邻
【发布时间】:2018-08-06 12:48:44
【问题描述】:

我正在努力如何在问题标题中解释这一点,所以我会在这里做得更好。

我有一个数组,它包含 360 列和 180 行,代表地球上每个纬度和经度。为清楚起见,我的数据如下所示:

longitudes = [0, 1, 2 ... 358, 359]
latitudes = [90, -89 ... -89, -90]
data = np.random.randint(5, (180, 360))

看起来像this,其中经度'0'等于0E,'359'等于-1E。

如您所见,Africa 在数组的开头和结尾处被分割,我想移动数组,使第一列对应于 -180E,最后一列对应于 180E,就像传统的世界观 ( map) - 这将使数组的子集化为“cookie cut”非洲。

如何移动/转换数组以使第一列和最后一列相邻?

(额外:由于您可以将我的数组视为圆柱体,因此在地理上,第一行和最后一行是相邻的,但是我如何更改“圆柱体被切割”的位置 - 我一直在考虑的类比)

【问题讨论】:

  • 我已经查看了可能的欺骗,但不认为这是一个解决方案。我知道它适用于我的两个列表,但不适用于我的数组。

标签: python numpy indexing transform gdal


【解决方案1】:

解决方案是使用numpy.roll()

我首先找到了180E对应的列的索引:

idx = (longitude.index(180))

然后,我根据该索引“滚动”数据以将 180E 移动到最左列,使用:

rolled_data = np.roll(data, idx, axis=1)

这成功地将 0E 列居中以创建我想要的输出。

【讨论】:

    【解决方案2】:

    请看这个答案:Efficient way to shift a list in python

    似乎和你想要的一样。

    从接受的答案:

    Collections.deque

    from collections import deque
    items = deque([1, 2])
    items.append(3) # deque == [1, 2, 3]
    items.rotate(1) # The deque is now: [3, 1, 2]
    items.rotate(-1) # Returns deque to original state: [1, 2, 3]
    item = items.popleft() # deque == [2, 3]
    

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2022-06-28
      • 2020-07-15
      • 2021-10-05
      相关资源
      最近更新 更多