Индекс элемента в массиве NumPy
В Python мы можем получить индекс значения в массиве с помощью .index(). Как это сделать с помощью массива NumPy?
Когда я пытаюсь сделать
decoding.index(i)
говорится, что библиотека NumPy не поддерживает эту функцию. Есть ли способ сделать это?
Ответы
Ответ 1
Используйте 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]),)
Ответ 2
Вы можете преобразовать массив 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
я именно то, что вы хотите.
Ответ 3
Я разрываюсь между этими двумя способами реализации индекса массива NumPy:
idx = list(classes).index(var)
idx = np.where(classes == var)
Оба принимают одинаковое количество символов, но первый метод возвращает int
вместо numpy.ndarray
.
Ответ 4
Вы можете использовать функцию 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]))
Первый выходной массив отображает индекс строки, а второй массив - соответствующий индекс столбца.
Ответ 5
Эту проблему можно эффективно решить с помощью библиотеки 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))