Split array at value in numpy

后端 未结 4 1718
逝去的感伤
逝去的感伤 2020-12-10 14:10

I have a file containing data in the format:

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

The data consists of multiple datasets, e

相关标签:
4条回答
  • 2020-12-10 14:17

    You don't need a python loop to evaluate the locations of each split. Do a difference on the first column and find where the values decrease.

    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)]
    
    0 讨论(0)
  • 2020-12-10 14:17
    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()
    

    results in

    [['x1', 'x2', 'x3'], ['x4', 'x5', 'x6', 'x7']]
    
    0 讨论(0)
  • 2020-12-10 14:26

    Once you have the data in a long numpy array, just do:

    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:])
    

    which will give you B containing three arrays B[0], B[1] and B[2] (in this case; I added a third "section" to prove to myself that it was working correctly).

    0 讨论(0)
  • 2020-12-10 14:31

    I actually liked Benjamin's answer, a slightly shorter solution would be:

    B= np.split(A, np.where(A[:, 0]== 0.)[0][1:])
    
    0 讨论(0)
提交回复
热议问题