How to select elements row-wise from a NumPy array?

后端 未结 2 1825
一向
一向 2021-02-05 15:05

I have an array like this numpy array

dd= [[foo 0.567 0.611]
     [bar 0.469 0.479]
     [noo 0.220 0.269]
     [tar 0.480 0.508]
     [boo 0.324 0.324]]
         


        
相关标签:
2条回答
  • 2021-02-05 15:41

    You have put the NumPy tag on your Question, so i'll assume you want NumPy syntax, which the answer before mine doesn't use.

    If in fact you wish to use NumPy, then you likely don't want the strings in your array, otherwise you will also have to represent your floats as strings.

    What you are looking for is the NumPy syntax to access elements of a 2D array by row (and exclude the first column).

    That syntax is:

    M[row_index,1:]        # selects all but 1st col from row given by 'row_index'
    

    W/r/t the second scenario in your Question--selecting non-adjacent columns:

    M[row_index,[0,2]]     # selects 1st & 3rd cols from row given by 'row_index'
    


    The small complication in your Question is just that you want to use a string for row_index, so it's necessary to remove the strings (so you can create a 2D NumPy array of floats), replace them with numerical row indices and then create a look-up table to map the the strings with the numerical row indices:

    >>> import numpy as NP
    >>> # create a look-up table so you can remove the strings from your python nested list,
    >>> # which will allow you to represent your data as a 2D NumPy array with dtype=float
    >>> keys
          ['foo', 'bar', 'noo', 'tar', 'boo']
    >>> values    # 1D index array comprised of one float value for each unique string in 'keys'
          array([0., 1., 2., 3., 4.])
    >>> LuT = dict(zip(keys, values))
    
    >>> # add an index to data by inserting 'values' array as first column of the data matrix
    >>> A = NP.hstack((vals, A))
    >>> A
            NP.array([  [ 0., .567, .611],
                        [ 1., .469, .479],
                        [ 2., .22, .269],
                        [ 3., .48, .508],
                        [ 4., .324, .324] ])
    
    >>> # so now to look up an item, by 'key':
    >>> # write a small function to perform the look-ups:
    >>> def select_row(key):
            return A[LuT[key],1:]
    
    >>> select_row('foo')
          array([ 0.567,  0.611])
    
    >>> select_row('noo')
          array([ 0.22 ,  0.269])
    

    The second scenario in your Question: what if the index column changes?

    >>> # e.g., move index to column 1 (as in your Q)
    >>> A = NP.roll(A, 1, axis=1)
    >>> A
          array([[ 0.611,  1.   ,  0.567],
                 [ 0.479,  2.   ,  0.469],
                 [ 0.269,  3.   ,  0.22 ],
                 [ 0.508,  4.   ,  0.48 ],
                 [ 0.324,  5.   ,  0.324]])
    
    >>> # the original function is changed slightly, to select non-adjacent columns:
    >>> def select_row2(key):
            return A[LuT[key],[0,2]]
    
    >>> select_row2('foo')
            array([ 0.611,  0.567])
    
    0 讨论(0)
  • 2021-02-05 15:45

    First, the vector of first elements is

    dv = dd[:,0]
    

    (python is 0-indexed)

    Second, to walk the array (and store in a dict, for example) you write:

    dc = {}
    ind = 0 # this corresponds to the column with the names
    for row in dd:
        dc[row[ind]] = row[1:]
    
    0 讨论(0)
提交回复
热议问题