Как извлечь элементы из матрицы с помощью вектора индексов с помощью numpy?
предположим, что у меня есть матрица a порядка mxn и вектор mx1. Я хотел бы извлечь элементы из каждой строки матрицы A, используя элементы векторов в качестве смещения в каждой строке.
например,
A = [[3, 0, 0, 8, 3],
[9, 3, 2, 2, 6],
[5, 5, 4, 2, 8],
[3, 8, 7, 1, 2],
[3, 9, 1, 5, 5]]
и вектора
y = [4,2,1,3,2]
то, что я хочу достичь, это то, что я хочу способ извлечь элементы такого, что каждый элемент вектора индексирует элемент в соответствующей строке A, т. е., реализация
for i in xrange(y):
A[i,y[i]] = #perform operations here
без использования каких-либо четких контуров.
ожидаемый результат,
[3,2,5,1,1]
Я использую Python и библиотеку numpy.
Спасибо за помощь!
2 ответов
вы должны начать с преобразования списка A
в массив NumPy:
>>> import numpy as np
>>> A = np.array([[3, 0, 0, 8, 3],
... [9, 3, 2, 2, 6],
... [5, 5, 4, 2, 8],
... [3, 8, 7, 1, 2],
... [3, 9, 1, 5, 5]])
...
>>> y = [4, 2, 1, 3, 2]
и после этого, ничто не мешает использовать дополнительные индексации:
>>> A[np.arange(A.shape[0]), y]
array([3, 2, 5, 1, 1])
>>> A[np.arange(A.shape[0]), y] = -99
>>> A
array([[ 3, 0, 0, 8, -99],
[ 9, 3, -99, 2, 6],
[ 5, -99, 4, 2, 8],
[ 3, 8, 7, -99, 2],
[ 3, 9, -99, 5, 5]])
следующее придерживается обычного стиля python, но не оптимизировано для скорости. Попробуйте и посмотрите, работает ли он для вашего варианта использования.
A = [[1, 0, 0, 6, 1],
[8, 2, 1, 1, 5],
[1, 1, 0, 0, 4],
[3, 8, 7, 1, 2],
[3, 9, 1, 5, 5]]
b = [0, 1, 2, 3, 4]
result = [A[i][b_i] for i, b_i in enumerate(b)]
# -> [1, 2, 0, 1, 5]