【问题标题】:Is there a way to make a list of arrays, sorted out from first column?有没有办法制作从第一列排序的数组列表?
【发布时间】:2021-01-28 16:02:04
【问题描述】:

我必须列出从第一列编号分组的数组。这是使用 numpy。 我有以下数组; X。第一列显示如何使用数字 0、1、3 和 4 组织数组。

x = np.array([[0,0,0,0,3],
              [1,0,0,2,3],
              [4,0,0,0,0],
              [3,0,0,0,2],
              [0,0,0,0,3],
              [1,0,0,2,3]])

我发现了如何对数组进行排序:

data = x[np.argsort(x[:, 0])]
print(data)
[[0 0 0 0 3]
 [0 0 0 0 3]
 [1 0 0 2 3]
 [1 0 0 2 3]
 [3 0 0 0 2]
 [4 0 0 0 0]]

但输出必须是包含数组元素的列表 像这样:

list_of_arrays = np.array([[[0,0,0,3],
                            [0,0,0,3]], 
                           [[0,0,2,3],[0,0,2,3]], 
                           [[0,0,0,2]],
                           [[0,0,0,0]]])

因此,第一列用作数组在列表中的外观标记。 总的来说,我对 python 和编码很陌生,因此非常感谢任何帮助。

【问题讨论】:

    标签: python list numpy


    【解决方案1】:

    单线:

    [np.row_stack(x[np.where(x[:, 0] == y)])[:, 1:] for y in set(x[:, 0])]
    
    [array([[0, 0, 0, 3],
            [0, 0, 0, 3]]),
     array([[0, 0, 2, 3],
            [0, 0, 2, 3]]),
     array([[0, 0, 0, 2]]),
     array([[0, 0, 0, 0]])]
    

    解释:这是一个列表推导,set() 将首先从第一个矩阵列中选择所有唯一值。理解会遍历所有这些值,np.where 会找到以每个值开头的行的索引。然后每一行的第一列被切片表达式移除,并且这些行被row_stack()分组到数组中。

    【讨论】:

    • 我非常怀疑这是否会按照上面的要求进行分组。
    • 没有第三个维度 - 结果按第一个(现已删除)订单号分组
    • 啊,我明白了
    【解决方案2】:

    您需要对第一个值进行分组,然后您可以使用 fromiter 创建新数组并相应地调整它们的大小并重新组合成一个数组:

    import numpy as np
    from itertools import chain, groupby, tee
    
    x = np.array([[0,0,0,0,3],
                  [1,0,0,2,3],
                  [4,0,0,0,0],
                  [3,0,0,0,2],
                  [0,0,0,0,3],
                  [1,0,0,2,3]])
    
    
    def fromiter2d_drop_first(it, dtype):
        # modified from
        # https://stackoverflow.com/a/45738134/7505395 
        it, it2 = tee(it)
        length = sum(1 for _ in it2) 
    
        flattened = chain.from_iterable(it)
        array_1d = np.fromiter(flattened, dtype)
        array_2d = np.reshape(array_1d, (length, -1))
        return array_2d [:, 1:]
    
    
    data = x[np.argsort(x[:, 0])]
    groups = np.array( [fromiter2d_drop_first(v, int) 
                        for k,v in groupby(data, key=lambda i:i[0])], dtype=object)
    print(groups)
    

    输出:

    [array([[0, 0, 0, 3], [0, 0, 0, 3]])
     array([[0, 0, 2, 3], [0, 0, 2, 3]]) 
     array([[0, 0, 0, 2]])
     array([[0, 0, 0, 0]])]
    

    【讨论】:

      【解决方案3】:

      解决方案:
      这可能会对您有所帮助:

      import numpy as np
      from itertools import groupby
      from operator import itemgetter
      
      x = np.array([[0,0,0,0,3],
                    [1,0,0,2,3],
                    [4,0,0,0,0],
                    [3,0,0,0,2],
                    [0,0,0,0,3],
                    [1,0,0,2,3]])
      
      def get_arr_lists(iterr):
          tmp_list = []
          for val in iterr:
              tmp_list.append(val[1:])
          return tmp_list
      
      data = x[np.argsort(x[:, 0])]
      
      final_arr = [get_arr_lists(iterr) for x, iterr in groupby(data, key = itemgetter(0))]
      
      print(final_arr)
      

      输出:

      [
          [array([0, 0, 0, 3]), array([0, 0, 0, 3])], 
          [array([0, 0, 2, 3]), array([0, 0, 2, 3])], 
          [array([0, 0, 0, 2])], 
          [array([0, 0, 0, 0])]
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-28
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        相关资源
        最近更新 更多