30

I am trying to take the following R statement and convert it to Python using NumPy:

1 + apply(tmp,1,function(x) length(which(x[1:k] < x[k+1])))

Is there a Python equivalent to which()? Here, x is row in matrix tmp, and k corresponds to the number of columns in another matrix.

Previously, I tried the following Python code, and received a Value Error (operands could not be broadcast together with shapes):

for row in tmp:
        print np.where(tmp[tmp[:,range(k)] < tmp[:,k]])
6
  • you are scripting tmp twice.. do you mean to use row instead inside the loop? Commented Aug 31, 2012 at 0:15
  • Where does your k come from? What shape is your tmp? Commented Aug 31, 2012 at 0:29
  • OK for this example, but this question may be extended to a multidimensional boolean array in which you want the index of 'True' values Commented Apr 1, 2016 at 9:05
  • 2
    That's some pretty obfuscated R code for "the number of previous elements which were < x[k+1]. We don't even need the inefficient length(which(...)), we only need to directly sum the Booleans sum(x[1:k] < x[k+1]). Commented Nov 27, 2016 at 17:34
  • Related question Pandas Equivalent of R's which() Commented Nov 27, 2016 at 17:35

3 Answers 3

6
    >>> which = lambda lst:list(np.where(lst)[0])

    Example:
    >>> lst = map(lambda x:x<5, range(10))
    >>> lst
    [True, True, True, True, True, False, False, False, False, False]
    >>> which(lst)
    [0, 1, 2, 3, 4]
Sign up to request clarification or add additional context in comments.

1 Comment

While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.
4

The Python code below answers my question:

np.array([1 + np.sum(row[range(k)] < row[k]) for row in tmp])

Here tmp is a 2d array, and k is a variable which was set for column comparison.

Thanks to https://stackoverflow.com/users/601095/doboy for inspiring me with the answer!

Comments

1

From http://effbot.org/zone/python-list.htm:

To get the index for all matching items, you can use a loop, and pass in a start index:

i = -1
try:
    while 1:
        i = L.index(value, i+1)
        print "match at", i
except ValueError:
    pass

1 Comment

This is simpler and more readable matchings_indices = [ i for i, x in enumerate(x) if x == value ]

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.