代码之家  ›  专栏  ›  技术社区  ›  tda

移位数组使第一列和最后一列相邻

  •  1
  • tda  · 技术社区  · 6 年前

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

    我有一个数组,包含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。

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

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

    (额外:因为你可以把我的数组看作一个圆柱体,从地理位置上讲,第一行和最后一行是相邻的,但是我如何改变“圆柱体被切割”的位置——我一直在想这个类比)

    2 回复  |  直到 6 年前
        1
  •  1
  •   tda    6 年前

    解决办法是 numpy.roll() .

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

    idx = (longitude.index(180))
    

    然后,我基于此索引“滚动”数据,使用以下命令将180E移动到最左边的列:

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

    这成功地将0E列居中,以创建所需的输出。

        2
  •  -1
  •   VegardKT    6 年前

    请看这个答案: 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]