### R的哪个（）和which.min（）相当于Python

#### [英]R's which() and which.min() Equivalent in Python

I read the similar topic here. I think the question is different or at least `.index()` couldnot solve my problem.

This is a simple code in R and its answer:

``````x <- c(1:4, 0:5, 11)
x
#  1  2  3  4  0  1  2  3  4  5 11
which(x==2)
#  2 7
min(which(x==2))
#  2
which.min(x)
# 5
``````

Which simply returns the index of the item which meets the condition.

If `x` be the input for Python, how can I get the indeces for the elements which meet criteria `x==2` and the one which is the smallest in the array `which.min`.

``````x = [1,2,3,4,0,1,2,3,4,11]
x=np.array(x)
x[x>2].index()
##'numpy.ndarray' object has no attribute 'index'
``````

## 4 个解决方案

### #1

8

Numpy does have built-in functions for it

Numpy确实有内置的功能

``````x = [1,2,3,4,0,1,2,3,4,11]
x=np.array(x)
np.where(x == 2)
np.min(np.where(x==2))
np.argmin(x)

np.where(x == 2)
Out: (array([1, 6], dtype=int64),)

np.min(np.where(x==2))
Out: 1

np.argmin(x)
Out: 4
``````

### #2

3

A simple loop will do:

``````res = []
x = [1,2,3,4,0,1,2,3,4,11]
for i in range(len(x)):
if check_condition(x[i]):
res.append(i)
``````

One liner with comprehension:

``````res = [i for i, v in enumerate(x) if check_condition(v)]
``````

Here you have a live example

### #3

1

You could also use `heapq` to find the index of the smallest. Then you can chose to find multiple (for example index of the 2 smallest).

``````import heapq

x = np.array([1,2,3,4,0,1,2,3,4,11])

heapq.nsmallest(2, (range(len(x))), x.take)
``````

Returns `[4, 0]`

### #4

1

NumPy for R provides you with a bunch of R functionalities in Python.

NumPy for R为您提供了Python中的一系列R功能。

As to your specific question:

``````import numpy as np
x = [1,2,3,4,0,1,2,3,4,11]
arr = np.array(x)
print(arr)
# [ 1  2  3  4  0  1  2  3  4 11]

print(arr.argmin(0)) # R's which.min()
# 4

print((arr==2).nonzero()) # R's which()
# (array([1, 6]),)
``````