Python equivalent of which() in R
Asked Answered
L

3

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]])
Laevogyrate answered 30/8, 2012 at 23:27 Comment(6)
you are scripting tmp twice.. do you mean to use row instead inside the loop?Zubkoff
Where does your k come from? What shape is your tmp?Visional
OK for this example, but this question may be extended to a multidimensional boolean array in which you want the index of 'True' valuesPlausible
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]).Linn
Related question Pandas Equivalent of R's which()Linn
After looking for the question asked here, I'm finding that this and related posts don't actually answer it. which() compares a vector against a condition and returns a vector of the indices which meet it. I think this post answers the literal question asked here.Henhouse
S
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]
Stringent answered 17/10, 2016 at 18:44 Comment(1)
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.Shannan
L
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!

Laevogyrate answered 31/8, 2012 at 16:40 Comment(0)
R
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
Rna answered 31/8, 2012 at 0:6 Comment(1)
This is simpler and more readable matchings_indices = [ i for i, x in enumerate(x) if x == value ]Zubkoff

© 2022 - 2024 — McMap. All rights reserved.