Выбор определенных строк и столбцов из массива NumPy

Я сошел с ума, пытаясь понять, какая глупость я здесь делаю неправильно.

Я использую NumPy, и у меня есть конкретные индексы строк и конкретные индексы столбцов, которые я хочу выбрать. Вот суть моей проблемы:

  • Как преобразовать массив numpy в (и отобразить) изображение?
  • Инвертирование буферизированного массива numpy с использованием ~
  • вызов c из python с помощью ctypes: проходящих векторов
  • ValueError: матрицы не выровнены для ошибки копирования и x
  • Самый короткий способ разрезать четные / нечетные строки из массива python?
  • загрузить csv в 2D-матрицу с numpy для построения графика
  • import numpy as np a = np.arange(20).reshape((5,4)) # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11], # [12, 13, 14, 15], # [16, 17, 18, 19]]) # If I select certain rows, it works print a[[0, 1, 3], :] # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [12, 13, 14, 15]]) # If I select certain rows and a single column, it works print a[[0, 1, 3], 2] # array([ 2, 6, 14]) # But if I select certain rows AND certain columns, it fails print a[[0,1,3], [0,2]] # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ValueError: shape mismatch: objects cannot be broadcast to a single shape 

    Почему это происходит? Разумеется, я должен был бы выбрать 1, 2 и 4 строки, 1-й и 3-й столбцы? Результат, который я ожидаю, следующий:

     a[[0,1,3], [0,2]] => [[0, 2], [4, 6], [12, 14]] 

  • python numpy фильтрует два размерных массива по условию
  • Numpy: Создание сложного массива из двух реальных?
  • 2D-массивы в Python
  • Как найти конкретную «область» значений в массиве 2D numpy?
  • numpy сокращение для взятия зубчатого среза
  • Чтение строки файла в массив (по-питоническому)
  • 3 Solutions collect form web for “Выбор определенных строк и столбцов из массива NumPy”

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

     >>> a[[[0, 0], [1, 1], [3, 3]], [[0,2], [0,2], [0, 2]]] array([[ 0, 2], [ 4, 6], [12, 14]]) 

    Это, конечно, боль, чтобы писать, поэтому вы можете позволить вещанию помочь вам:

     >>> a[[[0], [1], [3]], [0, 2]] array([[ 0, 2], [ 4, 6], [12, 14]]) 

    Это гораздо проще сделать, если вы индексируете массивы, а не списки:

     >>> row_idx = np.array([0, 1, 3]) >>> col_idx = np.array([0, 2]) >>> a[row_idx[:, None], col_idx] array([[ 0, 2], [ 4, 6], [12, 14]]) 

    Как предполагает Тоан, простым взломом было бы просто сначала выбрать строки, а затем выбрать столбцы над этим .

     >>> a[[0,1,3], :] # Returns the rows you want array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [12, 13, 14, 15]]) >>> a[[0,1,3], :][:, [0,2]] # Selects the columns you want as well array([[ 0, 2], [ 4, 6], [12, 14]]) 

    [Изменить] Встроенный метод: np.ix_

    Недавно я обнаружил, что numpy дает вам встроенный однострочный сканер для выполнения именно того , что предложил @Jaime, но без использования синтаксиса вещания (который страдает отсутствием удобочитаемости). Из документов:

    Используя ix_, можно быстро построить массивы индексов, которые будут индексировать кросс-продукт. a[np.ix_([1,3],[2,5])] возвращает массив [[a[1,2] a[1,5]], [a[3,2] a[3,5]]] .

    Таким образом, вы используете его следующим образом:

     >>> a = np.arange(20).reshape((5,4)) >>> a[np.ix_([0,1,3], [0,2])] array([[ 0, 2], [ 4, 6], [12, 14]]) 

    И способ, которым это работает, состоит в том, что он заботится о выравнивании массивов так, как предложил Хайме, чтобы вещание происходило правильно:

     >>> np.ix_([0,1,3], [0,2]) (array([[0], [1], [3]]), array([[0, 2]])) 

    Кроме того, как отмечает MikeC в комментарии, np.ix_ имеет то преимущество, что возвращает представление, которое мой первый (предварительный) ответ не np.ix_ . Это означает, что теперь вы можете назначить индексированный массив:

     >>> a[np.ix_([0,1,3], [0,2])] = -1 >>> a array([[-1, 1, -1, 3], [-1, 5, -1, 7], [ 8, 9, 10, 11], [-1, 13, -1, 15], [16, 17, 18, 19]]) 

    ОБЛАСТЬ ПРИМЕНЕНИЯ:

      >>> a[[0,1,3]][:,[0,2]] array([[ 0, 2], [ 4, 6], [12, 14]]) 

    ИЛИ:

     >>> a[[0,1,3],::2] array([[ 0, 2], [ 4, 6], [12, 14]]) 
    Python - лучший язык программирования в мире.