Извлечение подэлементов из матрицы в Python

У меня есть такая матрица:

0   0   0   138
0   8   0   0
0   1   0   0
131 0   0   138
0   0   138 0
0   0   0   0
0   115 0   8

и этот индексный вектор:

idx = [2,4,5]

Мне нужно получить индекс строки и индекс столбца из матрицы для всех записей со 138, но только для строк в idx.

Как хранится ваша матрица?

Daniele Cappuccio 13.04.2018 14:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
78
3

Ответы 3

Если вы храните матрицу так:

matrix = [ [0, 0, 0, 138], [0, 8, 0, 0], ... ]

Тогда ваша работа довольно проста:

result = []
for i in idx:
    row = matrix[i]
    for j in range(len(row)):
        if row[j] == 138:
            result.append((i, j))
return result

Я сделал то же самое, но мне захотелось чего-то вроде нижеприведенного.

innuendo 13.04.2018 17:20

Поскольку вы используете numpy, вам следует попробовать сделать это в векторизованном виде:

import numpy as np

A = np.array([[0, 0, 0, 138],
              [0, 8, 0, 0],
              [0, 1, 0, 0],
              [131, 0, 0, 138],
              [0, 0, 138, 0],
              [0, 0, 0, 0],
              [0, 115, 0, 8]])

idx = np.array([2, 4, 5])

match = np.argwhere(A == 138)
res = match[np.in1d(match[:, 0], idx)]

# array([[4, 2]], dtype=int64)

Используйте индексы строк непосредственно на A, а затем найдите 138:

>>> import numpy as np
>>> 
>>> A = np.array([[0, 0, 0, 138],
...               [0, 8, 0, 0],
...               [0, 1, 0, 0],
...               [131, 0, 0, 138],
...               [0, 0, 138, 0],
...               [0, 0, 0, 0],
...               [0, 115, 0, 8]])
>>> 
>>> idx = np.array([2, 4, 5])
>>> 
>>> y, x = np.where(A[idx]==138)
>>> y = idx[y]
>>> y, x
(array([4]), array([2]))

Другие вопросы по теме