【问题标题】:How would you reshuffle this array efficiently?你将如何有效地重新洗牌这个数组?
【发布时间】:2018-05-11 02:09:33
【问题描述】:

我有一个数组arr_val,它在大尺寸的位置存储某个函数的值(为了说明,我们只取一个小的 4 个位置)。现在,假设我还有另一个数组loc_array 存储函数的位置,并假设位置再次是相同的数字 4。但是,位置数组是多维数组,因此每个位置索引具有相同的 4 个子-位置索引,每个子位置索引是一对坐标。为了清楚地说明:

arr_val = np.array([1, 2, 3, 4])
loc_array = np.array([[[1,1],[2,3],[3,1],[3,2]],[[1,2],[2,4],[3,4],[4,1]], 
                     [[2,1],[1,4],[1,3],[3,3]],[[4,2],[4,3],[2,2],[4,4]]])

上述两个数组的含义是某个感兴趣的参数的值,例如位置[1,1],[2,3],[3,1],[3,2]1,等等。但是,我有兴趣以不同的形式重新表达上面的相同事物,而不是随机点,我希望有以下易处理形式的坐标

coord = [[[1,1],[1,2],[1,3],[1,4]],[[2,1],[2,2],[2,3],[2,4]],[[3,1],[3,2], 
          [3,3],[3,4]],[[4,1],[4,2],[4,3],[4,4]]]

以及在各个坐标处的值以

形式给出
val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]

对于大型 numpy 数组,实现上述目标的一种非常有效的方法是什么?

【问题讨论】:

    标签: python arrays numpy binning array-broadcasting


    【解决方案1】:

    你可以像这样使用lexsort

    >>> order = np.lexsort(loc_array.reshape(-1, 2).T[::-1])
    >>> arr_val.repeat(4)[order].reshape(4, 4)
    array([[1, 2, 3, 3],
           [3, 4, 1, 2],
           [1, 1, 3, 2],
           [2, 4, 4, 4]])
    

    如果您确定 loc_array 是所有可能位置的排列,那么您可以避免排序:

    >>> out = np.empty((4, 4), arr_val.dtype)
    >>> out.ravel()[np.ravel_multi_index((loc_array-1).reshape(-1, 2).T, (4, 4))] = arr_val.repeat(4)
    >>> out
    array([[1, 2, 3, 3],
           [3, 4, 1, 2],
           [1, 1, 3, 2],
           [2, 4, 4, 4]])
    

    【讨论】:

      【解决方案2】:

      这不可能是你想要的答案,但它仍然有效。

      val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
      temp= ""
      int_list = []
      
      for element in val:
          temp_int = temp.join(map(str, element ))
          int_list.append(int(temp_int))
      
      int_list.sort()
      print(int_list)
      
      ## result ##
      [1132, 1233, 2444, 3412]
      
      • 将每个element array 更改为int 并构造int_list
      • 排序int_list
      • int_list构造2D np.array

      我跳过了最后一部分。您可以在网络上找到方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-10
        • 2018-03-16
        • 2022-06-28
        • 2013-08-27
        • 2021-04-23
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多