numpy сокращение для взятия зубчатого среза

У меня есть операция, которую я делаю обычно, которую я называю «зубчатым срезом», потому что я не знаю настоящего имени. Это лучше всего объясняется примером:

a = np.random.randn(50, 10) entries_of_interest = np.random.randint(10, size = 50) # Vector of 50 indices between 0 and 9 # Now I want the values contained in each row of a at the corresponding index in "entries of interest" jagged_slice_of_a = a[np.arange(a.shape[0]), entries_of_interest] # jagged_slice_of_a is now a vector with 50 elements. Good. 

Единственная проблема – это немного громоздко сделать это: a[np.arange(a.shape[0]), entries_of_interest] индексирование (кажется, глупо создавать «np.arange (a.shape [0])» просто ради этого). Мне нужно что-то вроде оператора : для этого, но : делает что-то еще. Есть ли более сжатый способ сделать эту операцию?

Лучший ответ:

Нет, нет лучшего способа с родным numpy. Вы можете создать вспомогательную функцию для этого, если хотите.

  • py.test: передать параметр функции фиксатора
  • почему я не могу изменить только один элемент во вложенном списке в Python
  • Итерация через url с помощью строк - python
  • Полнотекстовый поиск XML-данных с помощью Python: лучшие практики, плюсы и минусы
  • ошибка синтаксиса печати с помощью python 3
  • Как найти изображения с похожим цветом с помощью Python и PIL?
  • Pandas записывает данные в файл CSV
  • подсчет количества черных пикселей в изображении в Python с OpenCV
  • 3 Solutions collect form web for “numpy сокращение для взятия зубчатого среза”

    Я думаю, что ваш текущий метод, вероятно, лучший способ.

    Вы также можете использовать choose для такого выбора. Это синтаксически яснее, но сложнее получить право и потенциально более ограничено. Эквивалентом этого метода будет:

     entries_of_interest.choose(aT) 

    Элементами в jagged_slice_of_a являются диагональные элементы a[:,entries_of_interest]

    Немного менее громоздкий способ сделать это будет поэтому использовать np.diagonal чтобы извлечь их.

     jagged_slice_of_a = a[:, entries_of_interest].diagonal() 

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

     a[np.arange(a.shape[0]), entries_of_interest] 

    Но, как вы заметили, синтаксически проще a[:, entries_of_interest] имеет другую интерпретацию в numpy . Выбор подмножества столбцов массива – более общая задача, которая выбирает один (случайный) элемент из каждой строки.

    Ваш случай – это просто специализированный экземпляр

     a[I, J] 

    где I и J – 2 массива одинаковой формы. В общем случае entries_of_interest может быть меньше, чем a.shape[0] (не все строки) или больше (несколько элементов из некоторых строк) или даже 2d. Он может даже несколько раз выбирать определенные элементы.

    Я нашел в других вопросах SO, что выполнение такого рода выбора элементов происходит быстрее, когда применяется к a.flat . Но это требует некоторой математики для построения плоского индекса I*n+J

    С твоим особым знанием J , J , I кажется, лишняя работа, но numpy не может сделать такого предположения. Если этот выбор был более распространенным, кто-то мог написать функцию, которая обертывает ваше выражение

     def peter_selection(a,I): # check the a.shape[0]==I.shape[0] return a[np.arange(a.shape[0]), I] 
    Interesting Posts

    Логическая индексация в Numpy с двумя индексами, как в MATLAB

    Официальные несколько версий Python на одном компьютере?

    Как использовать send_json с pyzmq PUB SUB

    Как преобразовать числа в слова в Python

    Не удается заставить запросы python работать с прокси-серверами

    как унифицировать список dict в python

    Правильно ли использовать «import __main__»?

    У Python есть встроенная функция для естественной сортировки строк?

    Как загрузить файл по определенному пути на сервере: Python

    UnboundLocalError при использовании + =, но не списка добавления

    Pip Requirements.txt –global-option, вызывающий ошибки установки с другими пакетами. "Вариант не распознан"

    Почему python использует «магические методы»?

    Самый пифонический способ принятия аргументов с использованием optparse

    Когда оператор `==` не эквивалентен оператору `is`? (Python)

    Как случайным образом извлекать последовательности FASTA с помощью Python?

    Python - лучший язык программирования в мире.