it-roy-ru.com

Индекс элемента в массиве NumPy

В Python мы можем получить индекс значения в массиве с помощью .index (). Как я могу сделать это с массивом NumPy?

Когда я пытаюсь сделать

decoding.index(i)

он говорит, что библиотека NumPy не поддерживает эту функцию. Есть ли способ сделать это? 

32
Marc Ortiz

Используйте np.where, чтобы получить индексы, где заданное условие True.

Примеры:

Для 2D np.ndarray называется a:

i, j = np.where(a == value)

Для одномерного массива:

i, = np.where(a == value)

Который работает для таких условий, как >=, <=, != и так далее ...

Вы также можете создать подкласс np.ndarray с помощью метода index():

class myarray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return np.array(*args, **kwargs).view(myarray)
    def index(self, value):
        return np.where(self == value)

Тестирование:

a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3,  4,  5,  8,  9, 10]),)
62
Saullo G. P. Castro

Вы можете преобразовать массив NumPy в список и получить его индекс.

например

tmp = [1,2,3,4,5] #python list
a = numpy.array(tmp) #numpy array
i = list(a).index(2) # i will return index of 2, which is 1

я именно то, что вы хотите.

13
Statham

Я разрываюсь между этими двумя способами реализации индекса массива NumPy:

idx = list(classes).index(var)
idx = np.where(classes == var)

Оба принимают одинаковое количество символов, но первый метод возвращает int вместо numpy.ndarray.

6
jlansey

Вы можете использовать функцию numpy.nonzero() или метод nonzero() массива

import numpy as np

A = np.array([[2,4],
          [6,2]])
index= np.nonzero(A>1)
       OR
(A>1).nonzero()

Результат :

(array([0, 1]), array([1, 0]))

Первый массив в выводе отображает индекс строки , а второй массив отображает соответствующий индекс столбца .

1
N.Moudgil

Эту проблему можно эффективно решить с помощью библиотеки numpy_indexed (отказ от ответственности: я являюсь ее автором); который был создан для решения проблем этого типа. npi.indices можно рассматривать как n-мерное обобщение list.index. Он будет действовать на nd-массивах (вдоль указанной оси); а также будет искать несколько записей в векторизованном виде, в отличие от одного элемента за один раз.

a = np.random.Rand(50, 60, 70)
i = np.random.randint(0, len(a), 40)
b = a[i]

import numpy_indexed as npi
assert all(i == npi.indices(a, b))

Это решение имеет лучшую временную сложность (n log n в худшем случае), чем любой из ранее опубликованных ответов, и полностью векторизовано.

0
Eelco Hoogendoorn

Если вас интересуют индексы, лучшим выбором будет np.argsort (a)

a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)
0
Victor Zuanazzi