【问题标题】:Split array at value in numpy在numpy中的值处拆分数组
【发布时间】:2011-03-11 23:28:36
【问题描述】:

我有一个包含以下格式数据的文件:

0.0 x1
0.1 x2
0.2 x3
0.0 x4
0.1 x5
0.2 x6
0.3 x7
...

数据由多个数据集组成,每个数据集在第一列中以 0 开头(因此 x1,x2,x3 将是一组,x4,x5,x6,x7 将是另一组)。我需要分别绘制每个数据集,所以我需要以某种方式拆分数据。完成此任务的最简单方法是什么?

我意识到每次在第一列中遇到 0 时,我都可以逐行查看数据并拆分数据,但这似乎非常低效。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我其实很喜欢本杰明的回答,稍微短一点的解决方案是:

    B= np.split(A, np.where(A[:, 0]== 0.)[0][1:])
    

    【讨论】:

    • 如果有一件事我确定,那就是无论你用 Python 写什么,总有更短的方法!
    • @bafcu:老实说,我认为功劳真的应该归功于本杰明(而不是我)。我只是在“微调”他的答案。谢谢
    【解决方案2】:

    一旦你有一个长的 numpy 数组中的数据,就这样做:

    import numpy as np
    
    A = np.array([[0.0, 1], [0.1, 2], [0.2, 3], [0.0, 4], [0.1, 5], [0.2, 6], [0.3, 7], [0.0, 8], [0.1, 9], [0.2, 10]])
    B = np.split(A, np.argwhere(A[:,0] == 0.0).flatten()[1:])
    

    这将为您提供包含三个数组 B[0]、B[1] 和 B[2] 的 B(在这种情况下;我添加了第三个“部分”以向自己证明它工作正常)。

    【讨论】:

      【解决方案3】:

      您不需要 python 循环来评估每个拆分的位置。在第一列上做一个差异,找出值减少的地方。

      import numpy
      
      # read the array
      arry = numpy.fromfile(file, dtype=('float, S2'))
      
      # determine where the data "splits" shoule be
      col1 = arry['f0']
      diff = col1 - numpy.roll(col1,1)
      idxs = numpy.where(diff<0)[0]
      
      # only loop thru the "splits"
      strts = idxs
      stops = list(idxs[1:])+[None]
      groups = [data[strt:stop] for strt,stop in zip(strts,stops)]
      

      【讨论】:

        【解决方案4】:
        def getDataSets(fname):
            data_sets = []
            data = []
            prev = None
            with open(fname) as inf:
                for line in inf:
                    index,rem = line.strip().split(None,1)
                    if index < prev:
                        data_sets.append(data)
                        data = []
                    data.append(rem)
                    prev = index
                data_sets.append(data)
            return data_sets
        
        def main():
            data = getDataSets('split.txt')
            print data
        
        if __name__=="__main__":
            main()
        

        结果

        [['x1', 'x2', 'x3'], ['x4', 'x5', 'x6', 'x7']]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-14
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多