<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def read_ASCII_cols(infile, cols=[1, 2, 3]):
 # noqa: N802 """ Interpret input ASCII file to return arrays for specified columns. Notes ----- The specification of the columns should be expected to have lists for each 'column', with all columns in each list combined into a single entry. For example:: cols = ['1,2,3','4,5,6',7] where '1,2,3' represent the X/RA values, '4,5,6' represent the Y/Dec values and 7 represents the flux value for a total of 3 requested columns of data to be returned. Returns ------- outarr : list of arrays The return value will be a list of numpy arrays, one for each 'column'. """

    # build dictionary representing format of each row
    # Format of dictionary: {'colname':col_number,...}
    # This provides the mapping between column name and column number
    coldict = {}
    with open(infile, 'r') as f:
        flines = f.readlines()

    for l in flines:  # interpret each line from catalog file
        if l[0].lstrip() == '#' or l.lstrip() == '':
            continue
        else:
            # convert first row of data into column definitions using indices
            coldict = {str(i + 1): i for i, _ in enumerate(l.split())}
            break

    numcols = len(cols)
    outarr = [[] for _ in range(numcols)]
    convert_radec = False

    # Now, map specified columns to columns in file and populate output arrays
    for l in flines:  # interpret each line from catalog file
        l = l.strip()
        lspl = l.split()
        # skip blank lines, comment lines, or lines with
        # fewer columns than requested by user
        if not l or len(lspl) < numcols or l[0] == '#' or "INDEF" in l:
            continue

        # For each 'column' requested by user, pull data from row
        for c, i in zip(cols, list(range(numcols))):
            cnames = parse_colname(c)
            if len(cnames) > 1:
                # interpret multi-column specification as one value
                outval = ''
                for cn in cnames:
                    cnum = coldict[cn]
                    cval = lspl[cnum]
                    outval += cval + ' '
                outarr[i].append(outval)
                convert_radec = True
            else:
                # pull single value from row for this column
                cnum = coldict[cnames[0]]
                if isfloat(lspl[cnum]):
                    cval = float(lspl[cnum])
                else:
                    cval = lspl[cnum]
                    # Check for multi-column values given as "nn:nn:nn.s"
                    if ':' in cval:
                        cval = cval.replace(':', ' ')
                        convert_radec = True
                outarr[i].append(cval)

    # convert multi-column RA/Dec specifications
    if convert_radec:
        outra = []
        outdec = []
        for ra, dec in zip(outarr[0], outarr[1]):
            radd, decdd = radec_hmstodd(ra, dec)
            outra.append(radd)
            outdec.append(decdd)
        outarr[0] = outra
        outarr[1] = outdec

    # convert all lists to numpy arrays
    for c in range(len(outarr)):
        outarr[c] = np.array(outarr[c])

    return outarr