Получение элементов с несколькими индексами в массиве NumPy - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь получить доступ к определенным строкам и столбцам массива NumPy, как объясняет документация , но я думаю, что что-то упущено.

У меня есть следующий массив:

arr = np.random.randint(10, size=(6, 4))
array([[1, 9, 6, 4],
       [8, 5, 0, 3],
       [3, 7, 3, 2],
       [1, 4, 8, 0],
       [5, 5, 8, 0],
       [0, 6, 4, 9]])

И я хочу получить первый и последний ряд;и первый, третий и последний столбец, поэтому я пытаюсь:

arr[(0, -1),(0, 1, 3)]

Но это приводит к следующей ошибке:

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)

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

array([[1, 9, 4],
       [0, 6, 9]])

Я могу сделать это таким образом, но это очень неловко:

arr[(0,-1),:][:,(0,1,3)]

Как я могу получить i-тые элементы разных измерений?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы ищете np.ix_:

arr[np.ix_((0, -1),(0, 1, 3))]

Результаты в

array([[1, 9, 4],
       [0, 6, 9]])
0 голосов
/ 12 июня 2018

Одним из способов является явное указание индекса каждого элемента результата, где ключевое отличие состоит в том, что спецификация строки должна быть 2d:

>>> np.random.seed(444)
>>> arr = np.random.randint(10, size=(6, 4))
>>> arr
array([[3, 0, 7, 8],
       [3, 4, 7, 6],
       [8, 9, 2, 2],
       [2, 0, 3, 8],
       [0, 6, 6, 0],
       [3, 0, 6, 7]])

>>> rows = [[0],
...         [-1]]
>>> cols = [0, 1, -1]
>>> arr[rows, cols]
array([[3, 0, 8],
       [3, 0, 7]])

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

Чтобы использовать расширенную индексацию, необходимо явно выбрать все элементы.... Однако, так как вышеупомянутые массивы индексации повторяются, вещание может использоваться.Пример, в котором вы не могли бы воспользоваться преимуществами широковещания и должен был бы указать каждый отдельный индекс, будет выглядеть примерно так:

rows = [[1, 2],
        [3, 4]]
cols = [[2, 3],
        [1, 0]]

В этом случае вы выбираете элементы в (1,2), (2, 3), ...

См. этот пример из документации.

Вы можете заметить, что это именно то, что производится np.ix_ (хотя я не говорю, что это не полезная функция):

>>> rows, cols = np.ix_((0, -1),(0, 1, 3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...