Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

How would one loop through array selecting foo and getting 0.567 0.611 as floats as a singleton. Then select bar and getting 0.469 0.479 as floats as a singleton .....

I could get vector the first elements as list by using

dv=  dd[:,1]

The 'foo', and 'bar' elements are not unknown variables, they can change.

How would I change if element is in position [1]?

[[0.567 foo2 0.611]
  [0.469 bar2 0.479]
  [0.220 noo2 0.269]
  [0.480 tar2 0.508]
  [0.324 boo2 0.324]]
like image 209
Merlin Avatar asked Sep 25 '11 02:09

Merlin


People also ask

How do I select a few rows from a NumPy array?

We can use [][] operator to select an element from Numpy Array i.e. Example 1: Select the element at row index 1 and column index 2. Or we can pass the comma separated list of indices representing row index & column index too i.e.

How do I slice a row in NumPy array?

To slice elements from two-dimensional arrays, you need to specify both a row index and a column index as [row_index, column_index] . For example, you can use the index [1,2] to query the element at the second row, third column in precip_2002_2013 .

How do you select values from an NP array?

To select an element from Numpy Array , we can use [] operator i.e. It will return the element at given index only.

How do you access rows and columns in NumPy?

Access the ith column of a Numpy array using transposeTranspose of the given array using the . T property and pass the index as a slicing index to print the array.


2 Answers

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])
like image 96
doug Avatar answered Sep 17 '22 18:09

doug


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:]
like image 44
Foo Bah Avatar answered Sep 16 '22 18:09

Foo Bah