0

Индексация массива numpy с помощью списка кортежей

6

Проблема с индексированием ndarray с использованием списка кортежей

Я пытаюсь индексировать массив ndarray, используя список кортежей в следующем формате:

idx = [(x1, y1), ... (xn, yn)]
X[idx]

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

idx2 = numpy.array(idx)
X[idx2[:, 0], idx2[:, 1]]  # или более общим образом:
X[tuple(numpy.vsplit(idx2.T, 1)[0])]

Вопрос: есть ли более простой и питоничный способ сделать это?

2 ответ(ов)

0

Вы можете использовать список кортежей, но соглашение об этом отличается от того, что вам нужно. numpy ожидает список индексов строк, за которым следует список индексов столбцов. По всей видимости, вы хотите указать список пар (x, y).

Документация по этому вопросу доступна по следующей ссылке: integer array indexing.

Вот пример, где мы получаем 3 точки в двумерном массиве. (2 точки в двумерном пространстве могут вызывать путаницу):

In [223]: idx
Out[223]: [(0, 1, 1), (2, 3, 0)]
In [224]: X[idx]
Out[224]: array([2, 7, 4])

Используя ваш стиль пар индексов xy:

In [230]: idx1 = [(0, 2), (1, 3), (1, 0)]
In [231]: [X[i] for i in idx1]
Out[231]: [2, 7, 4]

Или, вы можете воспользоваться следующим способом:

In [240]: X[tuple(np.array(idx1).T)]
Out[240]: array([2, 7, 4])

Также можно использовать X[tuple(zip(*idx1))], что является другим способом выполнения преобразования. tuple() является необязательным в Python 2. zip(*...) — это идиома Python, которая обращает вложенность списка списков.

Вы на правильном пути с:

In [242]: idx2 = np.array(idx1)
In [243]: X[idx2[:, 0], idx2[:, 1]]
Out[243]: array([2, 7, 4])

Мой вариант с tuple() просто немного компактнее (и не обязательно более 'питонично'). Учитывая соглашения numpy, некоторое преобразование является необходимым.

(Нужен ли нам еще один вариант, который будет работать для n-мерных массивов и m-точек?)

0

Для индексации массива в NumPy вы можете использовать кортеж (tuple) из NumPy массивов, который можно напрямую передать для индексации вашего массива. Вот пример, который иллюстрирует, как это сделать:

import numpy as np

# Предположим, у вас есть некоторый массив и кортеж индексов
prev_array = np.array([...])  # Ваш массив здесь
index_tuple = (..., ...)       # Ваши индексы здесь

# Создайте кортеж массивов из индексов
index = tuple(np.array(list(zip(*index_tuple))))

# Используйте полученный кортеж для индексации
new_array = prev_array[index].tolist()  # Конвертируем в список, если это необходимо

Таким образом, вы можете эффективно индексировать многомерные массивы с помощью кортежа NumPy массивов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь