Краткая версия: учитывая список с двумя элементами [i, j], как мне получить i , j -элемент двухмерного массива вместо i , j строк: от arr[[i,j]] до arr[i,j].

Я видел похожие случаи, когда использовался *list, но я не совсем понимаю, как работает этот оператор.

Более глубокий контекст:

У меня есть функция, которая возвращает вложенный список, где каждый подсписок представляет собой пару индексов, которые будут использоваться в массиве:


grid = np.full((3,3), 1)

def path():
   ...
   return [[i_1, j_1], [i_2, j_2], ...]

for i in path():
   grid[path()[i]] = 0

Но поскольку path()[i] является списком, grid[path()[i]] == 0 устанавливает две строки равными нулю, а не один элемент. Как мне этого избежать?
Хотя это и не является строго необходимым, более быстрое решение было бы предпочтительнее, так как эту операцию нужно проделывать много раз.

2
Tobias Holm 27 Ноя 2021 в 16:07

1 ответ

Лучший ответ

Что вас смущает, так это разница в математической нотации и индексировании 2D (или n-мерных) списков в Python / языках программирования.

Если у вас есть 2D-матрица в математике под названием X , и, допустим, вы хотите получить доступ к элементу в первой строке и первом столбце, вы должны написать X (1, ​​1 ) .

Если у вас есть 2D-массив, это списки. Итак, если вы хотите получить доступ к 1-й строке массива с именем X , вы должны:

X[0] # 0 because indexation starts at 0

Имейте в виду, что предыдущий оператор возвращает новый список . Вы также можете проиндексировать этот список. Поскольку нам нужен первый столбец, мы делаем:

X[0][0] # element in 1st row and 1st column of matrix X

Таким образом, ответ заключается в том, что вам необходимо последовательно индексировать матрицу, то есть применять цепную индексацию.

Что касается вашего первоначального вопроса, вот мой ответ. Допустим, a - это список из двух элементов, содержащий индексы i и j , к которым вы хотите получить доступ в 2D-массиве. Я обозначу 2D-массив как b . Затем вы применяете цепную индексацию, первый индекс - это первый элемент a , а второй индекс - второй элемент a :

a = [0, 0]  # list with 2 elements containing the indices
b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  # 2D array in which you want to access b[0][0]
i, j = a[0], a[1]
print(b[i][j])

Очевидно, вам не нужно использовать переменные i, j , я просто сделал это для ясности:

print(b[a[0]][a[1]])

Оба оператора распечатывают элемент в 1-й строке и 1-м столбце b :

1
1
waykiki 27 Ноя 2021 в 16:27