【问题标题】:In Python, split array rows into groups according to the value in specific column of that array [duplicate]在Python中,根据该数组特定列中的值将数组行分成组[重复]
【发布时间】:2019-08-19 18:08:53
【问题描述】:

我有一个数组,其中每行数据都遵循顺序,由末尾的标签列标识。举个小例子,它的格式是这样的:

arr = [[1,2,3,1], 
       [2,3,4,1],
       [3,4,5,1],
       [4,5,6,2],
       [5,6,7,2],
       [7,8,9,2],
       [9,10,11,3]]

我想使用标签列作为分组标记将数组分成组。所以上面的数组会产生3个数组:

arrA = [[1,2,3,1], 
        [2,3,4,1],
        [3,4,5,1]]

arrB = [[4,5,6,2],
        [5,6,7,2],
        [7,8,9,2]]

arrC = [9,10,11,3]

我目前有这个 FOR 循环,将每个组数组存储在 wins 列表中:

wins = []
for w in range(1, arr[-1,3]+1):
    wins.append(arr[arr[:, 3] == w, :]) 

这项工作没问题,但我有几个大型数据集要处理,所以有没有一种矢量化的方法可以做到这一点,也许可以使用 numpy 库中的 diff()where()

【问题讨论】:

  • @Georgy,您提供的链接中的答案通过简单的索引修改对我有用,谢谢。所以我会将我的问题标记为重复

标签: python arrays split vectorization


【解决方案1】:

好的,我使用“numpy group by”搜索条件进行了更多挖掘,这要感谢评论但现在删除了他们评论的人,并发现了这个非常相似的问题:Is there any numpy group by function?

我将 Vincent J (https://stackoverflow.com/users/1488055/vincent-j) 的答案改编为这个,它产生了正确的结果:

wins = np.split(arr[:, :], np.cumsum(np.unique(arr[:, 3], return_counts=True)[1])[:-1])

我将使用此代码,但如果有人认为有更好的方法,请务必加入。

【讨论】:

    【解决方案2】:

    我知道您似乎想要数组,但我认为您似乎在问dict 可能是解决此问题的更简单方法?

    from collections import defaultdict
    
    wins = defaultdict(list)
    
    for item in arr:
        wins[item[-1]].append(item) 
    

    那么您想要的单独数组是 wins 中的值(例如,wins[1] 是标签为 1 的项目数组)。

    对我来说似乎更具 Pythonic 和可读性!

    【讨论】:

      【解决方案3】:

      我认为这段代码对于任何不是绝对海量的数据集来说都足够快:

      for a in arr:
          while True:
              try:
                  wins[a[-1]].append(a)
                  break
              except IndexError:
                  wins.append([])
      

      您绝对不会得到比O(n) 更好的东西。如果您的数据存储在其他地方,例如 SQL 数据库或其他地方,您最好在 sql 查询本身中运行此逻辑。

      【讨论】:

      • 这段代码实际上不起作用——你想要在 try 之后使用 break 语句(否则它会中断而不在实例中附加项目 a[-1] 不是有效的索引) !
      • @Ravenlocke 你是对的。已编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多