Есть ли функция NumPy для возврата первого индекса чего-либо в массиве? - PullRequest
395 голосов
/ 11 января 2009

Я знаю, что есть метод для списка Python, который возвращает первый индекс чего-либо:

>>> l = [1, 2, 3]
>>> l.index(2)
1

Есть ли что-то подобное для массивов NumPy?

Ответы [ 13 ]

2 голосов
/ 04 ноября 2016

Альтернативой выбору первого элемента из np.where () является использование выражения генератора вместе с перечислением, например:

>>> import numpy as np
>>> x = np.arange(100)   # x = array([0, 1, 2, 3, ... 99])
>>> next(i for i, x_i in enumerate(x) if x_i == 2)
2

Для двумерного массива можно сделать:

>>> x = np.arange(100).reshape(10,10)   # x = array([[0, 1, 2,... 9], [10,..19],])
>>> next((i,j) for i, x_i in enumerate(x) 
...            for j, x_ij in enumerate(x_i) if x_ij == 2)
(0, 2)

Преимущество этого подхода состоит в том, что он прекращает проверку элементов массива после обнаружения первого совпадения, тогда как np.where проверяет все элементы на совпадение. Выражение генератора будет быстрее, если в массиве есть совпадение.

1 голос
/ 12 июля 2017

Пакет numpy_indexed (заявление об отказе от ответственности, я его автор) содержит векторизованный эквивалент list.index для numpy.ndarray; то есть:

sequence_of_arrays = [[0, 1], [1, 2], [-5, 0]]
arrays_to_query = [[-5, 0], [1, 0]]

import numpy_indexed as npi
idx = npi.indices(sequence_of_arrays, arrays_to_query, missing=-1)
print(idx)   # [2, -1]

Это решение имеет векторизованную производительность, обобщает до ndarrays и имеет различные способы обработки пропущенных значений.

0 голосов
/ 10 апреля 2018

Примечание: это для версии Python 2.7

Вы можете использовать лямбда-функцию для решения проблемы, а работает как с массивом NumPy, так и со списком. your_list = [11, 22, 23, 44, 55] result = filter(lambda x:your_list[x]>30, range(len(your_list))) #result: [3, 4] import numpy as np your_numpy_array = np.array([11, 22, 23, 44, 55]) result = filter(lambda x:your_numpy_array [x]>30, range(len(your_list))) #result: [3, 4] И вы можете использовать

result[0]

для получения первого индекса отфильтрованных элементов.

Для Python 3.6 используйте

list(result)

вместо

result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...